Rest API V1

This version of the REST API is now deprecated. If you have an existing integration using this version (created before June 16, 2020), use this documentation for troubleshooting. This version will no longer be receiving updates. If you are creating a new integration, use the current REST API.

The REST API is a private key API for server-to-server integrations. These integrations push and pull final data from the Bloomerang database. The private key allows anyone to change any information they want, so you must keep this key secret. Online transaction forms would expose the private key, so you cannot use the REST API with them. To submit donation information with the REST API, you must process the donations and collect any funds yourself, then submit the finished data to Bloomerang from your server.

API - Public/Private Keys

The Bloomerang API is organized around REST. It's a simple, resource-oriented approach to writing and reading data to and from a Bloomerang database. All you need to get started are your organization's API keys. You'll notice there are two keys: a Public key and a Private key.

Public Key

Used for public integration points like an online donation form. This will not allow you to pull any records from your database, but will let you post donations/signups as well as pull aggregate data such as a giving thermometer. Most of your database is off-limits using this key since it will likely be viewed in plain text somewhere on a web page.

All public API keys start with pub_ so you should be able to easily distinguish this from your private key.

Private Key

Guard this key with your life. This gives you full read/write access to any of your data exposed by any of the endpoints in the API. When writing hosted solutions/integrations this is the key you will need to capture and supply with each call to authenticate yourself.

API - Key Handshake

One hurdle to integrating with Bloomerang is getting the user's API key. Most endpoints require the user's private key. You could ask your user to copy/paste their Bloomerang API key, but that's a poor user experience. To make this more seamless, we've provided the Keys endpoint so that you can ask the user to enter their Bloomerang username/password on your side and then make an API call behind the scenes where we'll authenticate those credentials and return their API keys.

IMPORTANT: This should be done ONCE for a customer. Have them authenticate themselves and then store the API key on your side for future use. The user's username and password may not be used to authenticate any other endpoints. Just obtain the key and store that.

Sample Request

POST https://api.bloomerang.com/v1/Keys
{
    Username: "bob.smith@myorganization.org",
    Password: "eyeH3@rtTw1light!"
}

Sample Response

{
    PublicKey: "pub_2a7d9e94-eede-4d0c-b60d-82220ba6511a",
    PrivateKey: "13891375-0310-4444-a659-43a81ba8b041"
}

API - Authentication

Once you have your API keys, provide one of them using a process similar to HTTP Basic Auth. Supply your key as the username for the basic auth — you can leave the password side blank (hence the trailing colon in the examples).

Note that this implementation is slightly different from RFC2617. You should not base64-encode the API key. If you're using a standard REST client, set the Authorization header yourself instead of using that client's built-in authentication framework.

Sample Request

GET https://api.bloomerang.com/v1/Campaign/1234
Content-Type: application/json; charset=utf-8
Authorization: Basic fb2a5d4b-7c2c-11e2-98d3-4ceb426db38d:

API - Constituent

You can search, get, update, and create constituents via the API. A constituent represents a donor, volunteer, or any other individual/organization affiliated with your organization.

Retrieve a Constituent

GET https://api.bloomerang.com/v1/Constituent/{constituent-id}

Sample Request

GET https://api.bloomerang.com/v1/Constituent/1234

Sample Response

{
    Type: "Individual"
    Status: "Active"
    FirstName: "Frodo"
    LastName: "Baggins"
    Middle: "H"
    Prefix: "Mr."
    Suffix: "Sr."
    FullName: "Frodo H Baggins"
    InformalName: "Frodo"
    FormalName: "Mr. Baggins"
    EnvelopeName: "Mr. Frodo Baggins Sr."
    RecognitionName: "Mr. Frodo H Baggins Sr."
    JobTitle: "Adventurer"
    Employer: "Gandalf"
    AccountNumber: 1
    Website: "www.lordoftherings.net"
    FacebookId: "frodobaggins"
    TwitterId: "frodobaggins"
    LinkedInId: ""
    Gender: "Male"
    Birthdate: "2968-09-22T00:00:00"
    Address: {
        AccountId: 1234
        TypeName: "Home"
        Street: "123 Main St."
        City: "Hobbiton"
        State: "New York"
        County: ""
        PostalCode: "12345"
        Country: "United States"
        IsPrimary: true
        Id: 9332
    },
    Addresses: [ ... array of Address objects ... ],
    PrimaryEmail: {
        AccountId: 1234 
        TypeName: "Home"
        Value: "frodo@lordoftherings.net"
        IsPrimary: true
        Id: 9345
    },
    Emails:[ ... array of Email objects ... ],
    PrimaryPhone: {
        AccountId: 1234
        TypeName: "Home"
        Extension: "333"
        Number: "(123) 123-5555"
        IsPrimary: true
        Id: 9349
    },
    Phones:[ ... array of Phone objects ... ],
    EmailInterestType: "All",
    AuditTrail: {
        CreatedDate: "2016-06-28T14:34:49Z",
        CreatedName: "[API]",
        LastModifiedDate: "2016-06-28T14:34:49Z",
        LastModifiedName: "[API]"
    },
    CustomFields: {
        "Shirt Size": [1]
           0: "L"
        "Attributes": [3]
           0: "Board Member"
           1: "Volunteer"
           2: "Member"
    }
    Id: 1234
}

Search For a Constituent

Rather than pulling your entire database, use the q query string parameter to search by name or contact info. Facilitate paging via the skip and take parameters, which default to 0 and 50 respectively.

GET https://api.bloomerang.com/v1/Constituent/?q=Bob+Smith

Sample Request

GET https://api.bloomerang.com/v1/Constituent/?q=Bob+Smith

Sample Request (Get Page 2)

GET https://api.bloomerang.com/v1/Constituent/?q=Bob+Smith?skip=50

Sample Response

{
    Total: 76,
    Start: 0,
    MaxItems: 50,
    Results: [
        { ... account 1 info ... },
        { ... account 2 info ... },
        ...
        { ... account 50 info ... }
    ]
}

Update a Constituent

POST https://api.bloomerang.com/v1/Constituent/{constituent-id}

Sample Request

POST https://api.bloomerang.com/v1/Constituent/1234
{
    Status: "Inactive",
    TwitterId: "theringbearer"
}

Sample Response

{
    Id: 1234,
    Type: "Individual",
    Status: "Inactive",
    Prefix: "Mr.",
    FirstName: "Frodo",
    Middle: "H",
    LastName: "Baggins",
    Suffix: "Sr.",
    FullName: "Frodo H Baggins",
    InformalName: "Frodo",
    FormalName: "Mr. Baggins",
    EnvelopeName: "Mr. Frodo Baggins Sr.",
    RecognitionName: "Mr. Frodo H Baggins Sr.",
    Website: "www.lordoftherings.net",
    FacebookId: "frodobaggins",
    TwitterId: "theringbearer",
    LinkedInId: "",
    Gender: "Male",
    Birthdate: "9/22/2968",
    Address: { ... },
    Addresses: [ ... ],
    PrimaryEmail: { ... },
    Emails: [ ... ],
    PrimaryPhone: { ... },
    Phones: [ ... ],
    EmailInterestType: "All",
    AuditTrail: { ... },
    CustomFields: { ... }
}

Create a New Constituent

POST https://api.bloomerang.com/v1/Constituent/

We'll assign an id that you'll receive in the response. For Individual records, the FirstName and LastName fields are required. For Organization records, the FullName field is required. Unless otherwise specified, the status will be Active.

Sample Request

POST https://api.bloomerang.com/v1/Constituent/
{
    Type: "Individual",
    FirstName: "Bob",
    LastName: "Smith",
    Website: "www.google.com",
    Address: {
        TypeName: "Home",
        Street: "98123 Main St.",
        City: "Indianapolis",
        State: "Indiana",
        PostalCode: "46250"
    },
    PrimaryEmail: {
        TypeName: "Home",
        Value: "bob.smith@example.com"
    },
    CustomFields: {
        "Shirt Size": ["S"]
    }
}

Sample Response

{
    Id: 92344,
    Type: "Individual",
    Status: "Active",
    FirstName: "Bob",
    LastName: "Smith",
    FullName: "Bob Smith",
    Website: "www.google.com",
    Address: {
        Id: 92345,
        AccountId: 92344,
        TypeName: "Home",
        Street: "98123 Main St.",
        City: "Indianapolis",
        State: "Indiana",
        PostalCode: "46250",
        Country: "United States",
        IsBad: false,
        IsPrimary: true
    },
    Addresses: [ ... ],
    PrimaryEmail: {
        AccountId: 92344,
        TypeName: "Home",
        Value: "bob.smith@example.com",
        IsPrimary: true,
        Id: 601088
    },
    Emails: [ ... ],
    PrimaryPhone: null,
    Phones: [],
    EmailInterestType: "All",
    AuditTrail: { ... },
    CustomFields: {
        "Shirt Size": ["S"]
    }
}

Attribute Reference

NameDescriptionFormatRequiredValid Values
IDThe automatically assigned unique identifier for the recordLongNo
TypeThe type of accountStringRequiredIndividual, Organization
StatusThe status of the accountStringNoActive, Inactive, Deceased
PrefixThe name prefix or title, such as "Mr."StringNo
FirstNameThe account's first name. For organizations, this is the first name of the primary contact.StringRequired
MiddleThe account's middle name.StringNo
LastNameThe account's last name.StringRequired
SuffixThe name suffix, such as "Jr."StringNo
FullNameThe name of the organization. Does not apply to accounts with Type = Individual.StringNo
FormalNameWe will auto-build this for you using name components.StringNo
InformalNameWe will auto-build this for you using name components.StringNo
EnvelopeNameWe will auto-build this for you using name components.StringNo
RecognitionNameWe will auto-build this for you using name components.StringNo
WebsiteThe constituent's website.String/URLNo
FacebookIDThe URL of the constituent's Facebook page/profile.String/URLNo
TwitterIDThe constituent's Twitter handle.StringNo
LinkedInIDThe URL for the constituent's LinkedIn profile.String/URLNo
GenderThe gender of the constituentStringNoMale, Female, Other
BirthdateThe constituent's birthdate.DateNomm/dd/yyyy
AddressThe address marked as Primary on a constituent's record.StringNoSee API – Address. For addresses outside United States, Canada, or Bermuda, use only Country and Address attributes. See ISO country codes.
PrimaryPhoneThe phone number marked as Primary on a constituent's record.NoSee API – Phone. Add "+" in front of a non-US phone number.
PrimaryEmailThe email address marked as Primary on a constituent's record.NoSee API – Email
AddressesAll of the constituent's address records.Array[Address]No
PhonesAll of the constituent's phone records.Array[Phone]No
EmailsAll of the constituent's email addresses.Array[Email]No
EmailInterestTypeSet which type of emails a constituent is interested in receiving.StringNoAll, Custom, OptedOut. Defaults to All. You cannot set a constituent's email interests to Custom through the API.
AuditTrailInformation about who created or modified a constituent and when.StringNoResponse only.
CustomFieldsAn associative array that maps names of custom fields to an array of applied values.CustomFieldsNo

API - Duplicate Constituent Search

Use the Duplicate Constituent Search API when you need to determine if a set of data matches an existing account. A classic case is determining if an online donation gets added to an existing account or if a new account needs to be created first.

How Duplicate Search Works

When determining a duplicate, the system searches an index of the database to get a list of potential matches. It looks at:

  • Full name (for organizations)
  • First name (for individuals; includes common nicknames)
  • Last name (for individuals)
  • Standardized street addresses
  • Email addresses
  • Last seven digits of phone numbers

For individuals, both first and last names must match. The system then pulls the accounts for potential matches from the database and determines if each account is a duplicate.

How a Duplicate Is Determined

A potential match is a duplicate when the account IDs match, or when the name matches and one of the following matches:

  • Email address
  • Standardized street address
  • Last seven digits of phone number

Full names for organizations must be identical to match. For individuals, these must be identical:

  • Last name
  • First name, accounting for common nicknames
  • Suffix, if both names have suffixes. If only one name has a suffix, the suffix is ignored.

Search for Duplicates

POST https://api.bloomerang.com/v1/Duplicates

Sample Request

POST https://api.bloomerang.com/v1/Duplicates
{
    FirstName: "Bob",
    LastName: "Smith",
    Street: "98123 Main Street",
    PhoneNumber: "(317) 5559-090",
    Email: "blah@notamatch.com"
}

Sample Response

{
    Total: 1,
    Start: 0,
    MaxItems: 500,
    Results: [{
        Id: 92344,
        Type: "Individual",
        Status: "Active",
        FirstName: "Bob",
        LastName: "Smith",
        FullName: "Bob Smith",
        Website: "www.google.com",
        Address: {
            Id: 92345,
            AccountId: 92344,
            IsPrimary: true,
            Type: "Home",
            Street: "98123 Main St.",
            City: "Indianapolis",
            State: "IN",
            PostalCode: "46250"
        },
        Addresses: [ ... ],
        PrimaryEmail: null,
        Emails: [],
        PrimaryPhone: null,
        Phones: [],
        EmailInterestType: "All",
        AuditTrail: { ... },
        CustomFields: {}
    }]
}

Attribute Reference

NameDescriptionFormatRequiredValid Values
TypeThe type of accountStringNoIndividual, Organization. Default is Individual.
FirstNameUse with Individual accounts only. The account's first name.StringRequired
LastNameUse with Individual accounts only. The account's last name.StringRequired
OrganizationNameUse with Organization accounts only. The organization's complete name.StringRequired
EmailAn email address. Compared to all email addresses in account's profile.StringNo
PhoneNumberA phone number. Compared to all phone numbers in account's profile.StringNo
StreetA street address. Compared to all street addresses in account's profile.StringNo

API - Merge Constituents

Two constituents may be merged. Organizations cannot be merged, nor can a constituent be merged into an organization.

To merge, the submitted constituent must match the first and last name, plus either phone, email, or address, of an existing constituent. See Duplicate Constituent Search for more details. If no match is found, a new constituent is created.

Merge Two Constituents

POST https://api.bloomerang.com/v1/Merge

Sample Request

POST https://api.bloomerang.com/v1/Merge
{
     Type: "Individual",
     FirstName: "Bob",
     LastName: "Smith",
     Address: {
          Street: "98123 Main St.",
          City: "Indianapolis",
          State: "Indiana",
          PostalCode: "46250",
     },
     PrimaryEmail: {
         TypeName: "Home",
         Value: "bob.smith@example.com"
     },
     PrimaryPhone: {
         TypeName: "Home",
         Number: "13175559876"
     }
}

Sample Response: Constituents Merged

{
    Id: 92344,
    Type: "Individual",
    Status: "Active",
    FirstName: "Bob",
    LastName: "Smith",
    FullName: "Bob Smith",
    ...
}

Sample Response: Constituent Created

{
    Id: 123,
    Type: "Individual",
    Status: "Active",
    FirstName: "Bob",
    LastName: "Smith",
    FullName: "Bob Smith",
    ...
}

API - Address

While you can access address records from the Constituents they belong to, it's more efficient to access them directly when all you want to do is work with contact info.

Retrieve an Address

GET https://api.bloomerang.com/v1/Address/{address-id}

Update an Address

POST https://api.bloomerang.com/v1/Address/{address-id}

Create a New Address

POST https://api.bloomerang.com/v1/Address/

Add an International Address

POST https://api.bloomerang.com/v1/Address/

For addresses outside United States, Canada, or Bermuda, use only the Country and Street attributes. City, State, and PostalCode values will be appended to the Street attribute. See UPU addressing guide for correct formatting.

Sample Request

POST https://api.bloomerang.com/v1/Address/
{
    AccountId: 92344,
    TypeName: "Work",
    Street: "221B Baker St",
    City: "London",
    PostalCode: "NW1 6XE",
    Country: "GB"
}

Attribute Reference

NameDescriptionFormatRequiredValid Values
IdThe automatically assigned unique identifier for this recordLongNo
AccountIdThe unique id of the Constituent that the address belongs toStringRequired
TypeNameThe type of addressStringRequiredHome, Work, Vacation
IsPrimaryIs this the primary address for the constituent? Automatically true for the first address added.BooleanNotrue, false
IsBadIs this address flagged as bad/invalid?BooleanNotrue, false
StreetThe street portion of the address. {NewLine} is acceptable for multiline addresses. For non-US/Canada/Bermuda addresses, use Street to store the entire address.StringNo
CityThe city portion of the address. For non-US/Canada/Bermuda addresses, this value will be added to Street.StringNo
StateThe state or province of the address.StringNo
PostalCodeThe ZIP code portion of the address.StringNo
CountryThe country portion of the address. Default is United States. We recommend using the 2- or 3-digit country code. See ISO country codes.StringNo

API - Email

While you can access email records from the accounts themselves, it's more efficient to access the email record directly when all you want to work with is contact info.

Retrieve an Email

GET https://api.bloomerang.com/v1/Email/{email-id}

Update an Email

POST https://api.bloomerang.com/v1/Email/{email-id}

Create a New Email

POST https://api.bloomerang.com/v1/Email

** Denotes a required field

  • Id (long) — The automatically assigned unique identifier for the record.
  • AccountId** (long) — The unique identifier of the Constituent record this email belongs to.
  • TypeName** (string) — "Home" or "Work"
  • IsPrimary (boolean) — If the constituent has more than one email, is this the primary? Automatically true for the first email added.
  • Value** (string) — The actual email address (e.g. "bob@bloomerang.com")

API - Phone

Although you can access phone number records from the accounts themselves, it's more efficient to access the phone record directly when all you want to work with is contact info.

Retrieve a Phone

GET https://api.bloomerang.com/v1/Phone/{phone-id}

Update a Phone

POST https://api.bloomerang.com/v1/Phone/{phone-id}

Create a New Phone

POST https://api.bloomerang.com/v1/Phone

Attribute Reference

NameDescriptionFormatRequiredValid Values
IdThe automatically assigned unique identifier for the recordLongNo
AccountIdThe unique identifier of the constituent record that this phone number belongs toLongRequired
TypeNameThe type of phone numberStringRequiredHome, Work, Mobile, Fax
IsPrimaryIf the constituent has more than one phone number, is this the primary? Automatically true for the first phone added.BooleanNotrue, false
NumberThe phone number. Automatically formatted for North American display style. Add "+" in front of a non-US phone number.StringNo
ExtensionThe extension for the phone numberStringNo

API - Timeline

This allows you to pull all timeline entries (transactions, interactions, notes, etc.) for a given constituent account.

Retrieve a Constituent's Timeline

GET https://api.bloomerang.com/v1/Timeline/{constituent-id}

Sample Request

GET https://api.bloomerang.com/v1/Timeline/1234

The timeline response includes arrays for: Id, Notes, Interactions, Donations, RecurringDonations, RecurringDonationPayments, Pledges, PledgePayments, and Tasks.

API - Donation

Standard one-time transactions. You can get a list of them from the Timeline endpoint for a given constituent, or read/create/update individual instances directly.

Retrieve a Donation

GET https://api.bloomerang.com/v1/Donation/{donation-id}

Update a Donation

POST https://api.bloomerang.com/v1/Donation/{donation-id}

Create a New Donation

POST https://api.bloomerang.com/v1/Donation

Sample Request

POST https://api.bloomerang.com/v1/Donation
{
    AccountId: 1234,
    Amount: 25.0,
    Date: "2/2/2013",
    FundName: "Unrestricted",
    AppealName: "Direct Mail",
    Check: {
        Number: "552"
    }
}

** Denotes a required field

  • Id (long) — The automatically assigned unique id of the record.
  • AccountId** (long) — The id of the constituent that the donation belongs to.
  • EntryType (string) — Read only value: "Donation".
  • Date (date) — The date that the donation was made in mm/dd/yyyy format.
  • Amount (decimal) — The amount of the donation in USD.
  • NonDeductible (decimal) — Equal to or less than the amount – this portion is not tax deductible.
  • AcknowledgementStatus (string) — "Yes", "No", or "DoNotAcknowledge" (default is "No").
  • FundName (string) — The display name of the currently applied fund.
  • CampaignName (string) — The display name of the currently applied campaign.
  • AppealName (string) — The display name of the currently applied appeal.
  • SoftCredits (Array[SoftCredit]) *Read Only — All of the soft credits attributed to a donation.
  • TributeName (string) — The display name of the applied tribute.
  • TributeType (string) — Either "In Memory of" or "In Honor of".
  • CustomFields (Custom Values) — An associative array that maps names of custom fields to an array of applied values.

Transaction Method Attribute Reference

The payment type can be modified only if the payment has not been processed (usually through Stripe, Authorize.Net, or BluePay).

NameDependent ValuesDescriptionFormatRequiredValid Values
CashPayment method is cash
IdAutomatically assigned ID for this recordLongNo
CheckPayment method is check
IdAutomatically assigned ID for this recordLongNo
NumberThe check numberStringYes, if using this method
DateThe date of the checkDate (mm/dd/yyyy)Yes, if using this method
CreditCardPayment method is credit card
IdAutomatically assigned ID for this recordLongNo
NumberCredit card number. Only submit the last four digits.LongYes, if using this method
ExpirationExpiration date of card.Date (mm/dd/yyyy)Yes, if using this method
EftPayment method is electronic funds transfer
IdAutomatically assigned ID for this recordLongNo
AccountTypeType of bank accountStringNoChecking, Savings
AccountNumberBank account number. Only submit last four digits.LongNo
RoutingNumberBank routing number. Submit all digits.LongNo

API - Recurring Donation

Use this endpoint to inform Bloomerang of a recurring donation schedule that is processed outside of Bloomerang. You can read/create/update individual instances just like any other record.

Note: You may not currently use this endpoint to create a recurring donation that will be autoprocessed by Bloomerang. You can create the record, but all payments must be handled manually or created through the RecurringDonationPayment endpoint. To have Bloomerang autoprocess a recurring donation, use a Bloomerang form (see API Documentation).

Retrieve a Recurring Donation

GET https://api.bloomerang.com/v1/RecurringDonation/{donation-id}

Update a Recurring Donation

Note: Partial updates are supported. You may not update the Amount. If you want to upgrade the donation, set an end date for the current recurring donation schedule and then create a new schedule with the desired amount.

POST https://api.bloomerang.com/v1/RecurringDonation/{donation-id}

Create a New Recurring Donation

POST https://api.bloomerang.com/v1/RecurringDonation

API - Recurring Donation Payment

Recurring donation payments are payments made to a pre-existing schedule. You can get a list of recurring donation schedules from the Timeline endpoint for a given constituent. You can read/create/update individual instances just like any other record.

Note: If a payment method is not specified, the payment defaults to the payment method on the schedule. If the schedule's payment method is "None", the recurring donation payment's payment method defaults to "Cash".

Retrieve a Recurring Donation Payment

GET https://api.bloomerang.com/v1/RecurringDonationPayment/{donation-id}

Update a Recurring Donation Payment

POST https://api.bloomerang.com/v1/RecurringDonationPayment/{donation-id}

Create a New Recurring Donation Payment

POST https://api.bloomerang.com/v1/RecurringDonationPayment

API - Pledge

Retrieve a Pledge

GET /v1/Pledge/{pledge-id}

Create a New Pledge

Note: You may not currently use this endpoint to create a pledge that will be autoprocessed by Bloomerang. You can create the record, but all payments must be handled manually or created through the PledgePayment endpoint. To have Bloomerang autoprocess a pledge, use a Bloomerang form (see API Documentation).

POST /v1/Pledge

Update a Pledge

Note: After a pledge has been made, you cannot make changes to the schedule, dates, amounts, or assigned pledge ID through the API.

The following attributes can be updated, and none are required.

POST /v1/Pledge/{pledge-id}

API - Pledge Payment

Retrieve a Pledge Payment

GET /v1/PledgePayment/{pledge-payment-id}

Add a Pledge Payment

Note: If a payment method is not specified, the payment defaults to the payment method on the schedule. If the schedule's payment method is "None", the pledge payment's payment method defaults to "Cash".

The first four attributes are required to make a pledge payment. This call does not process the transaction in Bloomerang.

POST /v1/PledgePayment

Update a Pledge Payment

Note: After a pledge payment has been made, you cannot make changes to the dates, amounts, associated constituent, or assigned pledge through the API.

POST /v1/PledgePayment/{pledge-payment-id}

API - Refund

This call refunds the full amount of a donation, recurring donation payment, or pledge payment. If the transaction was processed in Bloomerang, the refund endpoint triggers a refund in the payment processor.

Make a Refund

POST https://api.bloomerang.com/v1/Refund

Sample Request

POST https://api.bloomerang.com/v1/Refund
{
     TransactionId: 1234,
     Reason: "API refund"
}

Attribute Reference

NameDescriptionFormatRequired
TransactionIdUnique ID of the transaction being refundedLongRequired
ReasonThe reason for refunding the transactionStringNo

API - Note

This is our representation of a dated, freeform note about a constituent.

Retrieve a Note

GET https://api.bloomerang.com/v1/Note/{note-id}

Update a Note

POST https://api.bloomerang.com/v1/Note/{note-id}

Create a New Note

POST https://api.bloomerang.com/v1/Note

** Denotes a required field

  • Id (long) — The automatically assigned unique identifier for the record.
  • AccountId** (long) — The id of the constituent the note belongs to.
  • Date** (date) — The date of the note in mm/dd/yyyy format.
  • Note** (string) — The long description of the note.

API - Interaction

This is our representation of a "touch" between the organization and the constituent in either direction.

Retrieve an Interaction

GET https://api.bloomerang.com/v1/Interaction/{interaction-id}

Update an Interaction

POST https://api.bloomerang.com/v1/Interaction/{interaction-id}

Create a New Interaction

POST https://api.bloomerang.com/v1/Interaction

** Denotes a required field

  • Id (long) — The automatically assigned unique identifier for the record.
  • AccountId** (long) — The id of the constituent the interaction belongs to.
  • Date** (date) — The date of the interaction in mm/dd/yyyy format.
  • Subject** (string) — The short, one line summary of the interaction.
  • Note (string) — The long description of the interaction.
  • Channel (string) — "Email", "MassEmail", "Phone", "Mail", "InPerson", "SocialMedia", "Website", or "Other".
  • Purpose (string) — "Acknowledgement", "ImpactCultivation", "Newsletter", "Receipt", "Solicitation", "SpecialEvent", "VolunteerActivity", "Welcome", or "Other".
  • IsInbound (boolean) — Was it the constituent reaching out to the organization?

API - Task

Update your organization's to-do list through the Task API.

Retrieve a Task

GET https://api.bloomerang.com/v1/Task/{task-id}

A returned CompletedDate value of "0001-01-01T00:00:00" indicates the task is not completed.

Add a Task

POST https://api.bloomerang.com/v1/Task

Update a Task

Only include those values that need to be updated. To mark a task as completed or archived, both the Status and CompletedDate fields must be included.

POST https://api.bloomerang.com/v1/Task/{task-id}

Reproduce "Save as Interaction"

You can replicate the "Save as Interaction" functionality through the API:

  • Create an interaction using the Interaction API. Note the InteractionId value.
  • Using the Task API, send an Update using the InteractionId and set the Status to Complete.

API - Fund

This is an attribute on transactions that lets you designate what the money is allowed to be used for. Bloomerang comes stocked with 3 funds: "Unrestricted", "Endowment", and "Program".

List All Funds

GET https://api.bloomerang.com/v1/Fund

Retrieve a Fund

GET https://api.bloomerang.com/v1/Fund/{fund-id}

Update a Fund

Note: You cannot deactivate a fund through the API.

POST https://api.bloomerang.com/v1/Fund/{fund-id}

Create a New Fund

POST https://api.bloomerang.com/v1/Fund

** Denotes a required field

  • Id (long) — The automatically assigned unique id of the record.
  • Name** (string) — The display name of the fund. Must be unique across all funds.
  • IsActive (boolean) — Is available to apply to new donations in the UI.
  • SortIndex (int) — What order should this fund appear in the list of all funds?

API - Campaign

This is an attribute on transactions that describes the long-term marketing campaign that helped bring money into the organization. Bloomerang does not come with any campaigns by default.

List All Campaigns

GET https://api.bloomerang.com/v1/Campaign

Retrieve a Campaign

GET https://api.bloomerang.com/v1/Campaign/{campaign-id}

Update a Campaign

Note: You cannot deactivate a campaign through the API.

POST https://api.bloomerang.com/v1/Campaign/{campaign-id}

Create a New Campaign

POST https://api.bloomerang.com/v1/Campaign

** Denotes a required field

  • Id (long) — The automatically assigned unique id of the record.
  • Name** (string) — The display name of the campaign. Must be unique across all campaigns.
  • IsActive (boolean) — Is available to apply to new donations in the UI.
  • SortIndex (int) — What order should this campaign appear in the list of all campaigns?
  • Goal (decimal) — The target dollar amount for this campaign.
  • StartDate (date) — When did this campaign activity begin? (mm/dd/yyyy)
  • EndDate (date) — When is this campaign activity over? (mm/dd/yyyy)

API - Appeal

This is an individual piece of marketing that is part of a larger Campaign — a particular letter, a specific event, or something more general like "Unsolicited".

List All Appeals

GET https://api.bloomerang.com/v1/Appeal

Retrieve an Appeal

GET https://api.bloomerang.com/v1/Appeal/{appeal-id}

Update an Appeal

Note: You cannot deactivate an appeal through the API.

POST https://api.bloomerang.com/v1/Appeal/{appeal-id}

Create a New Appeal

POST https://api.bloomerang.com/v1/Appeal

** Denotes a required field

  • Id (long) — The automatically assigned unique id of the record.
  • Name** (string) — The display name of the appeal. Must be unique across all appeals.
  • IsActive (boolean) — Is available to apply to new donations in the UI.
  • SortIndex (int) — What order should this appeal appear in the list of all appeals?
  • Goal (decimal) — The target dollar amount for this appeal.
  • StartDate (date) — When did this appeal activity begin? (mm/dd/yyyy)
  • EndDate (date) — When is this appeal activity over? (mm/dd/yyyy)

API - Custom Fields

Custom fields and their values are set up within Bloomerang. The types of custom fields are: Benevon, Constituent, Interaction, Note, and Transaction.

Use the CustomField API endpoint to get the IDs for custom fields. The endpoint is read-only. When building forms, submit the IDs instead of the names whenever possible — this prevents a name change from breaking the form.

List All Custom Fields for a Type

GET https://api.bloomerang.com/v1/CustomField/{area}

Replace {area} with a valid value: Benevon, Constituent, Interaction, Note, Transaction. Benevon is available only in Benevon-enabled databases.

Sample Request

GET https://api.bloomerang.com/v1/CustomField/Constituent?isActive=true

API - Custom Field Values

Use the CustomValue API endpoint to get the IDs for custom field values. The endpoint is read-only. When building forms, submit the IDs instead of the names whenever possible.

Get Custom Field Values

GET https://api.bloomerang.com/v1/CustomValue/{area}/{customFieldId}

Replace {area} with a valid value: Benevon, Constituent, Interaction, Note, Transaction. {customFieldId} is the Id of the custom field — get this value using the CustomField endpoint.

Sample Request

GET https://api.bloomerang.com/v1/CustomValue/Constituent/850?skip=0&take=25

API - User

You can search and get users via the API. Each person from an organization who needs to access their Bloomerang database needs a user account.

List All Users

GET https://api.bloomerang.com/v1/User

Retrieve a User

GET https://api.bloomerang.com/v1/User/{user-id}

Attribute reference:

  • Id (long) — The automatically assigned unique id of the record.
  • UserName (string) — The unique identifier of the user. Unique across all Bloomerang databases.
  • Name (string) — The display name of the user.
  • Email (string) — The email address associated with this user account.
  • Phone (string) — The phone number associated with this user account.
  • IsActive (boolean) — Is able to log into the database.
  • UserTimeZone (object) — The time zone selected for this user, with Id, UtcOffset, and Name properties.