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
| Name | Description | Format | Required | Valid Values |
|---|---|---|---|---|
| ID | The automatically assigned unique identifier for the record | Long | No | |
| Type | The type of account | String | Required | Individual, Organization |
| Status | The status of the account | String | No | Active, Inactive, Deceased |
| Prefix | The name prefix or title, such as "Mr." | String | No | |
| FirstName | The account's first name. For organizations, this is the first name of the primary contact. | String | Required | |
| Middle | The account's middle name. | String | No | |
| LastName | The account's last name. | String | Required | |
| Suffix | The name suffix, such as "Jr." | String | No | |
| FullName | The name of the organization. Does not apply to accounts with Type = Individual. | String | No | |
| FormalName | We will auto-build this for you using name components. | String | No | |
| InformalName | We will auto-build this for you using name components. | String | No | |
| EnvelopeName | We will auto-build this for you using name components. | String | No | |
| RecognitionName | We will auto-build this for you using name components. | String | No | |
| Website | The constituent's website. | String/URL | No | |
| FacebookID | The URL of the constituent's Facebook page/profile. | String/URL | No | |
| TwitterID | The constituent's Twitter handle. | String | No | |
| LinkedInID | The URL for the constituent's LinkedIn profile. | String/URL | No | |
| Gender | The gender of the constituent | String | No | Male, Female, Other |
| Birthdate | The constituent's birthdate. | Date | No | mm/dd/yyyy |
| Address | The address marked as Primary on a constituent's record. | String | No | See API – Address. For addresses outside United States, Canada, or Bermuda, use only Country and Address attributes. See ISO country codes. |
| PrimaryPhone | The phone number marked as Primary on a constituent's record. | No | See API – Phone. Add "+" in front of a non-US phone number. | |
| PrimaryEmail | The email address marked as Primary on a constituent's record. | No | See API – Email | |
| Addresses | All of the constituent's address records. | Array[Address] | No | |
| Phones | All of the constituent's phone records. | Array[Phone] | No | |
| Emails | All of the constituent's email addresses. | Array[Email] | No | |
| EmailInterestType | Set which type of emails a constituent is interested in receiving. | String | No | All, Custom, OptedOut. Defaults to All. You cannot set a constituent's email interests to Custom through the API. |
| AuditTrail | Information about who created or modified a constituent and when. | String | No | Response only. |
| CustomFields | An associative array that maps names of custom fields to an array of applied values. | CustomFields | No |
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
| Name | Description | Format | Required | Valid Values |
|---|---|---|---|---|
| Type | The type of account | String | No | Individual, Organization. Default is Individual. |
| FirstName | Use with Individual accounts only. The account's first name. | String | Required | |
| LastName | Use with Individual accounts only. The account's last name. | String | Required | |
| OrganizationName | Use with Organization accounts only. The organization's complete name. | String | Required | |
| An email address. Compared to all email addresses in account's profile. | String | No | ||
| PhoneNumber | A phone number. Compared to all phone numbers in account's profile. | String | No | |
| Street | A street address. Compared to all street addresses in account's profile. | String | No |
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
| Name | Description | Format | Required | Valid Values |
|---|---|---|---|---|
| Id | The automatically assigned unique identifier for this record | Long | No | |
| AccountId | The unique id of the Constituent that the address belongs to | String | Required | |
| TypeName | The type of address | String | Required | Home, Work, Vacation |
| IsPrimary | Is this the primary address for the constituent? Automatically true for the first address added. | Boolean | No | true, false |
| IsBad | Is this address flagged as bad/invalid? | Boolean | No | true, false |
| Street | The street portion of the address. {NewLine} is acceptable for multiline addresses. For non-US/Canada/Bermuda addresses, use Street to store the entire address. | String | No | |
| City | The city portion of the address. For non-US/Canada/Bermuda addresses, this value will be added to Street. | String | No | |
| State | The state or province of the address. | String | No | |
| PostalCode | The ZIP code portion of the address. | String | No | |
| Country | The country portion of the address. Default is United States. We recommend using the 2- or 3-digit country code. See ISO country codes. | String | No |
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
| Name | Description | Format | Required | Valid Values |
|---|---|---|---|---|
| Id | The automatically assigned unique identifier for the record | Long | No | |
| AccountId | The unique identifier of the constituent record that this phone number belongs to | Long | Required | |
| TypeName | The type of phone number | String | Required | Home, Work, Mobile, Fax |
| IsPrimary | If the constituent has more than one phone number, is this the primary? Automatically true for the first phone added. | Boolean | No | true, false |
| Number | The phone number. Automatically formatted for North American display style. Add "+" in front of a non-US phone number. | String | No | |
| Extension | The extension for the phone number | String | No |
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).
| Name | Dependent Values | Description | Format | Required | Valid Values |
|---|---|---|---|---|---|
| Cash | Payment method is cash | ||||
| Id | Automatically assigned ID for this record | Long | No | ||
| Check | Payment method is check | ||||
| Id | Automatically assigned ID for this record | Long | No | ||
| Number | The check number | String | Yes, if using this method | ||
| Date | The date of the check | Date (mm/dd/yyyy) | Yes, if using this method | ||
| CreditCard | Payment method is credit card | ||||
| Id | Automatically assigned ID for this record | Long | No | ||
| Number | Credit card number. Only submit the last four digits. | Long | Yes, if using this method | ||
| Expiration | Expiration date of card. | Date (mm/dd/yyyy) | Yes, if using this method | ||
| Eft | Payment method is electronic funds transfer | ||||
| Id | Automatically assigned ID for this record | Long | No | ||
| AccountType | Type of bank account | String | No | Checking, Savings | |
| AccountNumber | Bank account number. Only submit last four digits. | Long | No | ||
| RoutingNumber | Bank routing number. Submit all digits. | Long | No |
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
| Name | Description | Format | Required |
|---|---|---|---|
| TransactionId | Unique ID of the transaction being refunded | Long | Required |
| Reason | The reason for refunding the transaction | String | No |
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.