Introduction
An Agreement represents a recurring donation, membership, service, or a recurring purchase of a product, and so answers what is being paid for, for how much, when and how often.
Changes committed to an Agreement can be retrieved via the ChangeLog entity.
Endpoints
GET /agreements?pageNumber={x}&pageSize={y}&state={z}
Get a list of Shared Agreements at a given size by a given offset and availability type. Use "state" (see list of states below) to focus your query. All parameters are optional.
Response
| HTTP | Description |
|---|---|
| 200 | OK |
HTTP 200 Example
{
"pageNumber": {x},
"pageSize": {y},
"list": [
{
"agreementGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"...": "..."
},
{
"agreementGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"...": "..."
}
]
}
GET /agreement/{guid}
Get a single Agreement.
Response
| HTTP | Description |
|---|---|
| 200 | OK |
| 404 | Agreement not found |
HTTP 200 Example
{
"agreementGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"merchantId": "your-organisation",
"createdTs": "2019-01-01 00:00:00 +0100",
"state": "Available",
"name": "Membership",
"description": "Youth",
"purposeAccountingCode": "youth-membership",
"defaultQuantity": 1,
"unit": "pcs",
"unitPrice": 100.0,
"amount": 100.0,
"amountVat": 25.0,
"amountTotal": 125.0,
"vatPercentage": 25.0,
"currencyCode": "DKK",
"taxDeductable": false,
"scheduleType": "Monthly",
"scheduleBaseTier": 1,
"scheduleFixedDay": 1,
"scheduleEveryOther": 1,
"scheduleCalendarUnit": "Month",
"scheduleSelectedSet": "[1,2,5,6,7,12]",
"communicationCollectionGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"contactGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"dataSetGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx"
}
POST /agreement
Insert a single Agreement.
Request
The following must be provided as the request body:
{
"name": "Membership",
"description": "Youth",
"purposeAccountingCode": "youth-membership",
"defaultQuantity": 1,
"unit": "pcs",
"unitPrice": 100.0,
"amount": 100.0,
"amountVat": 25.0,
"amountTotal": 125.0,
"vatPercentage": 25.0,
"currencyCode": "DKK",
"taxDeductable": false,
"scheduleType": "Monthly",
"scheduleBaseTier": 1,
"scheduleFixedDay": 1,
"scheduleEveryOther": 1,
"scheduleCalendarUnit": "Month",
"scheduleSelectedSet": "[1,2,5,6,7,12]",
"communicationCollectionGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"contactGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"dataSetGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx"
}Response
| HTTP | Description |
|---|---|
| 201 | Created |
| 400 | Something's wrong with request body. |
HTTP 200 Example
{
"agreementGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"...": "..."
}
PUT /agreement/{guid}
Replace a single Agreement.
Request
The following must be provided as the request body:
{
"name": "Youth Membership",
"description": "",
"contactGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"defaultQuantity": 1,
"unit": "pcs",
"unitPrice": 100.0,
"amount": 100.0,
"amountVat": 25.0,
"amountTotal": 125.0,
"taxDeductable": false,
"vatPercentage": 25.0,
"currencyCode": "DKK",
"scheduleType": "Monthly",
"scheduleBaseTier": 1,
"scheduleFixedDay": 1,
"scheduleEveryOther": 1,
"scheduleCalendarUnit": "Month",
"scheduleSelectedSet": "[1,2,3,4,5,6]",
"purposeAccountingCode": "",
"dataSetGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx"
}Response
| HTTP | Description |
|---|---|
| 200 | OK |
| 400 | Something's wrong with request body. |
| 404 | Agreement not found |
HTTP 200 Example
{
"agreementGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"...": "..."
}PATCH /agreement/{guid}
Update a single Agreement. The following fields are patchable: name, description, defaultQuantity, unit, taxDeductable, externalId, purposeAccountingCode and communicationCollectionGuid
Request
The following must be provided as the request body:
[
{
"op": "replace",
"path": "/name",
"value": "New agreement name"
}
]Response
| HTTP | Description |
|---|---|
| 200 | OK |
| 400 | Something's wrong with request body. |
| 404 | Agreement was not found |
POST /agreement/{guid}/ChangeAmount
Change amount of a single Agreement.
Request
The following must be provided as the request body:
{
"unitPrice": 100.0,
"quantity": 1,
"amount": 100.0,
"amountVat": 25.0,
"amountTotal": 125.0,
"vatPercentage": 25.0
}Response
| HTTP | Description |
|---|---|
| 200 | OK |
| 400 | Something's wrong with request body. |
| 404 | Agreement was not found |
POST /agreement/{guid}/ChangeFrequency
Change frequency of a single Agreement.
Request
The following must be provided as the request body:
{
"scheduleType": "Monthly",
"scheduleBaseTier": 1,
"scheduleFixedDay": 1,
"scheduleEveryOther": 1,
"scheduleCalendarUnit": "Month",
"scheduleSelectedSet": "[1,2,3,4,5,6]"
}Response
| HTTP | Description |
|---|---|
| 200 | OK |
| 400 | Something's wrong with request body. |
| 404 | Agreement was not found |
POST /agreement/{guid}/Archive
Archives a single Agreement.
Response
| HTTP | Description |
|---|---|
| 200 | OK |
| 404 | Agreement was not found |
GET /agreement/{guid}/payments?pageNumber={x}&pageSize={y}
Get a list of Payments at a given size by a given offset.
Response
| HTTP | Description |
|---|---|
| 200 | OK |
HTTP 200 Example
{
"pageNumber": {x},
"pageSize": {y},
"list": [
{
"paymentGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"...": "..."
},
{
"paymentGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"...": "..."
}
]
}
GET /agreement/{guid}/subscriptions?pageNumber={x}&pageSize={y}
Get a list of Agreements at a given size by a given offset.
Response
| HTTP | Description |
|---|---|
| 200 | OK |
HTTP 200 Example
{
"pageNumber": {x},
"pageSize": {y},
"list": [
{
"subscriptionGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"...": "..."
},
{
"subscriptionGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"...": "..."
}
]
}
GET /agreement/{guid}/log?limit={limit}
Get a list of changes to an Agreement.
Response
| HTTP | Description |
|---|---|
| 200 | OK |
HTTP 200 Example
[
{
"changeGuid": "242bf0de-5ed3-48a1-bb3a-xxxxxxxxxxxx",
"createdTs": "2021-01-01 00:00:00 +0100",
"entityType": "Agreement",
"entityGuid": "9a7c3665-5be0-4a5c-9641-xxxxxxxxxxxx",
"changeTs": "2021-01-01 00:00:00 +0100",
"oldEntityJson": "{ .. }",
"changeDescription": "Updated by PUT request",
"requester": "",
"systemRequest": false,
"changes": [
{
"newValue": "Membership",
"oldValue": "Donation",
"fieldName": "name"
}
]
}
]Schema
| Property | Format and Description |
|---|---|
| agreementGuid |
string<uuid> Unique Guid |
| contactGuid |
string<uuid> Unique Guid |
| communicationCollectionGuid |
string<uuid> Unique Guid |
| dataSetGuid |
string<uuid> Unique Guid |
|
default_quantity |
integer TO BE DEPRECATED. Default quantity = 1. |
| createdTs |
string<yyyy-MM-dd HH:mm:ss zzzz> Timestamp of creation |
| updatedTs |
string<yyyy-MM-dd HH:mm:ss zzzz> Timestamp of update |
| archivedTs |
string<yyyy-MM-dd HH:mm:ss zzzz> Timestamp of archivation |
| merchantId |
string Unique ID of merchant |
|
name required |
string The name of the record |
| description |
string Description of the record |
|
unit required |
string TO BE DEPRECATED. Type of unit |
|
unitPrice required |
number TO BE DEPRECATED. Unit price of a single AddOn |
|
amount required |
number Summarised amount excluding VAT |
|
amountVat required |
number TO BE DEPRECATED. Amount VAT |
|
amountTotal required |
number TO BE DEPRECATED. Total amount including VAT |
|
vatPercentage required |
number TO BE DEPRECATED. VAT percentage |
|
currencyCode required |
string ISO formatted Currency Code |
| state |
string Enum: "Available", "Archived" |
| taxDeductible |
boolean Defines basis for tax deductibility |
| purposeAccountingCode |
string Accounting code provided by Merchant |
|
scheduleType required |
string See below for allowed schedule types. |
|
scheduleBaseTier required |
integer The offset in relation to the chosen calendarUnit. A Yearly subscription in March has baseTier: 3 |
|
scheduleFixedDay required |
integer The offset day of the chosen calendarUnit. |
|
scheduleEveryOther required |
integer The interval of the chosen calendarUnit. |
| scheduleCalendarUnit |
string Default: "Month" Due date is calculated by the chosen calendarUnit.
|
| scheduleSelectedSet |
string Only relevant for Custom scheduleType. |
| externalId |
string An external ID as provided by merchant |
| originTs |
string<yyyy-MM-dd HH:mm:ss zzzz> Timestamp of origin, useful when importing data (e.g. if originated in external system) |
Example
{
"agreementGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"contactGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"communicationCollectionGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"dataSetGuid": "a863d62e-d53b-4651-9b7b-xxxxxxxxxxxx",
"createdTs": "2019-12-31 15:59:59 +0100",
"updatedTs": "2019-12-31 15:59:59 +0100",
"archivedTs": "2019-12-31 15:59:59 +0100",
"merchantId": "your-merchant",
"name": "Recurring donation",
"description": "Custom regular donation",
"default_quantity": 1,
"unit": "pcs",
"unitPrice": 100,
"amount": 100,
"amountVat": 0,
"amountTotal": 100,
"vatPercentage": 0,
"currencyCode": "DKK",
"state": "Available",
"scheduleType": "Custom",
"scheduleBaseTier": 1,
"scheduleFixedDay": 2,
"scheduleEveryOther": 1,
"scheduleCalendarUnit": "Day",
"scheduleSelectedSet": "[1,4,5,11]",
"externalId": "some-id",
"originTs": "2019-12-31 15:59:59 +0100",
"purposeAccountingCode": "donation"
}
Schedule Types
Following is a list of allowed schedule types:
| scheduleType | Description |
|---|---|
| Manual | Payment occurs only when manually initiated |
| Custom | Uses provided baseTier, fixedDay, everyOther, calendarUnit and selectedSet to calculate next dueDate |
| Daily | Daily occurrence |
| Weekly | Weekly occurrence (~52 per year) |
| Monthly | Monthly occurrence (12 per year) |
| Quarterly | Quarterly occurrence (4 per year) |
| Halfyearly | Biannual occurrence (2 per year) |
| Yearly | Annual occurrence (1 per year) |
| MonthlyFirst | DEPRECATED. Monthly occurrence on the 1st of given month |
| QuarterlyFirst | DEPRECATED. Quarterly occurrence on the 1st of given month |
| HalfyearlyFirst | DEPRECATED. Biannual occurrence on the 1st of given month |
| YearlyFirst | DEPRECATED. Annual occurrence on the 1st of given month |
Schedule Calendar Units
Following is a list of allowed schedule calendar units:
| scheduleCalendarUnit | Description |
|---|---|
| Day | One day |
| Week | One week |
| Month | One month |
Examples of schedules
All the following examples, assumes that the start date of the related subscription is the 1st of January.
Example 1 The following will calculate due dates the 7th of every month. When scheduleEveryOther is 1, scheduleBaseTier does not have any effect.
- scheduleType: Monthly
- scheduleBaseTier: 1
- scheduleFixedDay: 7
- scheduleEveryOther: 1
- scheduleCalendarUnit: Month
Calculated dates are: 7/1, 7/2, 7/3, ...
Example 2 The following will calculate due dates at the 14th of every other month, starting in February.
- scheduleType: Custom
- scheduleBaseTier: 2
- scheduleFixedDay: 14
- scheduleEveryOther: 2
- scheduleCalendarUnit: Month
Calculated dates are: 14/2, 14/4, 14/6, ...
Example 3 The following will calculate due dates the 10th of every quarter, starting in March.
- scheduleType: Quarterly
- scheduleBaseTier: 3
- scheduleFixedDay: 10
- scheduleEveryOther: 3
- scheduleCalendarUnit: Month
Calculated dates are: 10/3, 10/6, 10/9, ...
Example 4 The following will calculate due dates the 28th of every December.
- scheduleType: Yearly
- scheduleBaseTier: 12
- scheduleFixedDay: 28
- scheduleEveryOther: 12
- scheduleCalendarUnit: Month
Calculated dates are: 28/12-2018, 28/12-2019, 28/12-2020, ...
Example 5 The following will calculate due dates the 2nd of the selected months.
- scheduleType: Custom
- scheduleBaseTier: 1
- scheduleFixedDay: 2
- scheduleEveryOther: 1
- scheduleCalendarUnit: Month
- scheduleSelectedSet: 1, 4, 5, 11
Calculated dates are: 2/1, 2/4, 2/5, 2/11, ...
Example 6 The following will calculate due dates every week, start from the 1. of May 2020.
Since the 1. of May 2020 is a friday, scheduleFixedDay should be set to 5.
- scheduleType: Weekly
- scheduleBaseTier: 1
- scheduleFixedDay: 5
- scheduleEveryOther: 1
- scheduleCalendarUnit: Week
Calculated dates are: 1/5-2020, 8/5-2020, 15/5-2020, 22/5-2020, 29/5-2020, ...
Agreement States
Following is a list of Agreement states:
| State | Description |
|---|---|
| Available | Agreement is available for Subscriptions. |
| Archived | Agreement was archived and is hidden from queries. |