API References
Platforms
The platform endpoint is about settings or general data about a specific platform which is used in the frontend.
Access is mostly limited to the platform to which the used API token belongs.
The platform endpoint is about settings or general data about a specific platform which is used in the frontend.
Access is mostly limited to the platform to which the used API token belongs.
This endpoint retrieves a specific platform.
HTTP Request
GET /v1/platforms/:id
The request command returns JSON structured like this:
{
"id": 1,
"subdomain": "ldug",
"name": "LeihDeinerUmweltGeld",
"operating_company_name": "CrowdDesk GmbH",
"operating_company_location": "Frankfurt",
"operating_company_url": "http://www.crowddesk.de",
"mail_from_name": "CrowdDesk Skynet",
"mail_from_address": "skynet@crowddesk.de",
"...": "..."
}
This may be only an extract of the provided data. Returned attributes might differ based on access rights.
Projects
This endpoint retrieves all projects of the platform based on the API token.
See endpoint for getting a specific project object for more information.
HTTP Request
GET /v1/projects
This endpoint retrieves a specific project.
HTTP Request
GET /v1/projects/:id
Object attributes should be self-explanatory or will be documented otherwise here.
The request command returns JSON structured like this:
{
"id": 1,
"name": "Windpark Demo",
"minimum_volume": "100000.0",
"maximum_volume": "500000.0",
"investments_count": 12,
"investments_sum": "8450.0",
"...": "..."
}
This may be only an extract of the provided data.
This endpoint retrieves all investments of a given project.
E.g. if you want to have the last 5 investments into this project, the endpoint would be …/projects/:id/investments?limit=5&sort=-checkout_finished_at.
See endpoint for getting a specific investment object for more information about the attributes.
HTTP Request
GET /v1/projects/:id/investments
With this endpoint you can simulate an investment into the project and retrieve all projected payouts (interest, repayments, taxes) that would occur. You can use this to show a table in your frontend that shows the earnings of an investment.
State changes from ‘pending’ to 'settled’ if there already was a payout from the project on this date.
HTTP Request
GET /v1/projects/:id/project_payouts
You can add the following GET parameters to your query:
Parameter | Description |
---|---|
amount | Investment amount based on which the payouts will be calculated (default: 1000) |
emission_id | Which specific emission of the project should be used for the calculations? (default: first emission of the project) |
investment_started_on | This parameter defines on which date the investment was activated and got a claim on interest and repayment from this date on. Should be in format of '2017-05-23’ (default: today) |
The request command returns JSON structured like this:
[
{
"payout_date": "2017-12-31",
"interest": "0.6",
"repayment": "0.0",
"taxes_kest": "0.15",
"taxes_kist": "0.0",
"taxes_soli": "0.01",
"state": "pending",
"gross_total": "0.6",
"net_total": "0.44",
"taxes_total": "0.16"
},
{
"payout_date": "2018-06-01",
"interest": "24.99",
"repayment": "0.0",
"taxes_kest": "6.25",
"taxes_kist": "0.0",
"taxes_soli": "0.34",
"state": "pending",
"gross_total": "24.99",
"net_total": "18.4",
"taxes_total": "6.59"
}
]
This may be only an extract of the provided data.
Emissions
This endpoint retrieves all emissions of the platform based on the API token.
See endpoint for getting a specific project object for more information.
HTTP Request
GET /v1/emissions
This endpoint retrieves a specific emission.
HTTP Request
GET /v1/emission/:id
Object attributes should be self-explanatory or will be documented otherwise here.
The request command returns JSON structured like this:
{
"id": 1,
"project_id": 1,
"issuer_id": 1,
"reference": "XYZ00123",
"minimum_volume": "100000.0",
"maximum_volume": "500000.0",
"investable": true,
"investment_amount_minimum": "100.0",
"investment_amount_maximum": null,
"investment_amount_partition": "50.0",
"url_to_checkout_start": "https://invest.demo-platform.com/invest/XYZ00123",
"...": "..."
}
This may be only an extract of the provided data. Returned attributes might differ based on access rights.
Issuers
This endpoint retrieves all issuers of the platform based on the API token.
See endpoint for getting a specific project object for more information.
HTTP Request
GET /v1/issuers
This endpoint retrieves a specific issuer.
HTTP Request
GET /v1/issuers/:id
Object attributes should be self-explanatory or will be documented otherwise here.
The request command returns JSON structured like this:
{
"id": 1,
"name": "Muster Emittent GmbH",
"street": "Berliner Str. 123",
"zip_code": "10439",
"city": "Berlin",
"country_code": "DE",
"register_number": "HRA 12345",
"register_name": "Amtsgericht Berlin",
"statutory_seat": "Frankfurt am Main"
}
This may be only an extract of the provided data. Returned attributes might differ based on access rights.
Investors
This endpoint retrieves all investors of the platform based on the API token.
See endpoint for getting a specific investor object for more information.
HTTP Request
GET /v1/investors
Search for Investors
You can search for investors by adding the ?q=#keyword#
query parameter to your GET request. The API will search for investors where keywords fit the email, first name, last name or reference number of the investor. The result is an array with one or multiple investor objects.
This endpoint retrieves a specific investor.
HTTP Request
GET /v1/investors/:id
Object attributes should be self-explanatory or will be documented otherwise here.
The request command returns JSON structured like this:
{
"id": 1,
"reference": "LD275510",
"type": "PrivateInvestor",
"title": "Dr.",
"gender": "male",
"first_name": "Max",
"last_name": "Mustermann",
"email": "muster@mustermann.com",
"wants_newsletter": false,
"...": "..."
}
This may be only an extract of the provided data. Returned attributes might differ based on access rights.
This endpoint authenticates a specific investor, so it can be logged in on frontend sites.
If successful it will return the investor object, if not it will will raise HTTP 401 Unauthorized
.
HTTP Request
POST /v1/investors/authenticate
POST Parameters | |
Parameter | Description |
---|---|
investors email address | |
password | investors password |
You might not only want to authenticate the investor but also to force a direct login. Therefore a redirect on our application is needed to set the according session cookies.
To do that, the returned investor object after a create or authenticate will include an token_login_url attribute.
You have to send the investor to this url to be logged in. After a successful login the investor will be redirected to the investor dashboard or to any url you added as a &redirect= GET parameter to the token_login_url.
The answers for a create or authenticate request will include the token_login_url
{
"...": "...",
"token_login_url": "https://demo.crowddesk.io/token_login?token=xyz123",
"...": "..."
}
This endpoint retrieves all investments of a given investor.
See endpoint for getting a specific investment object for more information about the attributes.
HTTP Request
GET /v1/investors/:id/investments
This endpoint creates an investor.
Use the attribute * prevent_mail_dispatch* to tell the API if you do NOT want to have an “confirmation instructions” email to the user. By default we will send out an email for confirming the email address (double-opt-in).
The request returns the Investor object after successful creation.
HTTP Request
POST /v1/investors
Possible values to send in your JSON request are:
Parameter | Type | Required? | Description |
---|---|---|---|
prevent_mail_dispatch | Boolean | optional | If this is set to TRUE our system will NOT send out a mail with the link for the confirmation |
type | String | optional | “PrivateInvestor” or “CompanyInvestor”, if set |
gender | String | required | “male” or “female” |
title | String | optional | free text, e.g. “Prof. Dr.” |
first_name | String | required | e.g. “John” |
last_name | String | required | e.g. “Doe” |
String | required | must be unique | |
password | String | required | min. 5 chars |
accepts_terms_and_conditions | Boolean | required | must be set to true |
accepts_privacy_policy | Boolean | required | must be set to true |
wants_newsletter | Boolean | optional | determines if Investor wants to receive an email newsletter |
date_of_birth | Date | optional | e.g. “1980-01-1” |
city_of_birth | String | optional | e.g. “New York” |
street | String | optional | e.g. “Example Street 123” |
street_addition | String | optional | e.g. “Apt. 4a” |
zip_code | String | optional | e.g. “12345” |
city | String | optional | e.g. “Berlin” |
country_code | String | optional | e.g. “DE”, according the ISO 3166-1 standard as Alpha-2 code |
nationality_code | String | optional | e.g. “DE”, according the ISO 3166-1 standard as Alpha-2 code |
preferred_locale | String | optional | e.g. “de”, according the ISO 639-1 standard |
phone_number | String | optional | e.g. “030 / 123 555 900” |
email_confirmed | Boolean | optional | set this to true if you already confirmed the Investor’s email address on your own (double-opt-in), it is not possible to |
email_confirmed_at | DateTime | optional | e.g. “2018-01-01 12:34:16”, DateTime when the Investor confirmed his email address for double-opt-in |
bank_account_owner | String | optional | e.g. “John Doe” |
bank_account_iban | String | optional | e.g. “DE185505012044823712” |
bank_account_bic | String | optional | e.g. “MALADE51MNZ” |
Mostly not required: | - | - | - |
securities_account_number | String | optional | e.g. “44823712” |
securities_account_bic | String | optional | e.g. “MALADE51MNZ” |
tax_identification_number | String | optional | e.g. “12365489753” |
taxable | Boolean | optional | determines if Investor is taxable |
identity_proof_type | String | optional | e.g. “Personalausweis” |
identity_proof_number | String | optional | e.g. “MKY391VRE” |
identity_proof_issuer | String | optional | e.g. “Berlin-Mitte” |
Only if CompanyInvestor: | - | - | - |
company_name | String | optional | e.g. “John Doe GmbH” |
company_legal_form | String | optional | e.g. “GmbH” |
company_register_number | String | optional | e.g. “HRA 12345” |
company_register_name | String | optional | e.g. “Amtsgericht Berlin” |
company_representative_function | String | optional | e.g. “Vorstand” |
company_date_of_foundation | Date | optional | e.g. “2018-01-01” |
The request command for your JSON POST should like this:
{
"gender": "male",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@mail.com",
"password": "superduper",
"accepts_terms_and_conditions": "true",
"accepts_privacy_policy": "true",
"prevent_mail_dispatch": true,
"...": "..."
}
This shows only the required data for creating an Investor.
See table for all possible attributes.
This endpoint updates an Investor.
The request returns the Investor object after successful update.
HTTP Request
PATCH /v1/investors/:id
Possible values to send in your JSON request are the same as in the Create request.
This endpoint is only available at the staging API!
This endpoint deletes an Investor.
The request returns 204 - No Content after a deleting the Investor.
HTTP Request
DELETE /v1/investors/:id
Investments
This endpoint retrieves all investments of the platform based on the API token.
See endpoint for getting a specific investment object for more information.
HTTP Request
GET /v1/investments
This endpoint retrieves a specific investment.
HTTP Request
GET /v1/investments/:id
Object attributes should be self-explanatory or will be documented otherwise here.
Investment states | |
---|---|
State | Description |
pending | the investment is awaiting the payin |
running | payin was received and investment is active |
canceled | no payin was received on time or the investment was canceled for other reasons |
settled | the final repayment for the investment was transferred and it is not active any longer |
The request command returns JSON structured like this:
{
"id": 1,
"investor_id": 1,
"emission_id": 1,
"reference": "LD1232295093",
"amount": "500.0",
"type": "SubordinatedLoan",
"state": "running",
"checkout_started_at": "2018-01-06T16:20:53.028+01:00",
"checkout_finished_at": "2018-01-06T16:21:19.400+01:00",
"...": "..."
}
This may be only an extract of the provided data.
Newsletter Signups
This Endpoint handles NewsletterSignups over the usual “Here you can sign up for our newsletter”-boxes.
You should use this API to handle NewsletterSignups to ensure they end up in the same mailing list (e.g. MailChimp List) as the investors and get a update if a former NewsletterSignups converts to an Investor.
You can also handle newsletter signups and double-opt-in verficiation completely on your own - only make sure that the newsletter list that is used in your frontend is the same as saved in the platform settings with us, or be aware how having two different lists effects your newsletter marketing.
The usual steps for a NewsletterSignups are:
User enters his email and optionally name and country and submits the form
User sees a “thanks we got it, please check your mails” message
Mail is send to the user
When user clicks the confirmation link, a “thanks you are now subscribed” message is shown
Signup to the correct mailing list is handled in the background
It is possible to let our system handle all the different steps and views or do it completely in your own frontend page.
We recommend using 2-digit country codes defined in ISO 3166 for the “country_code” field
HTTP Request
POST /v1/newsletter_signups
POST Parameters | ||
---|---|---|
Parameter | Type | Description |
String | Email address for the NewsletterSignup | |
first_name | String | First name for the NewsletterSignup (optional) |
last_name | String | Last name for the NewsletterSignup (optional) |
country_code | String | Country for the NewsletterSignup (optional) |
prevent_mail_dispatch | Boolean | If this is set to TRUE our system will NOT send out a mail with the link for the confirmation |
after_confirm_redirect_url | String | If you let our system send out a mail and handle the confirmation, you can define a url to which the user will be redirected afterwards - if not we well show the standard confirmation page |
Return Parameters | |
---|---|
Parameter | Description |
pending_newsletter_signup_url | This is a URL you could use to redirect your user after submitting the form to show message according to step 2. |
confirm_newsletter_signup_url | If you send mails by yourself, this is the URL you have to include for the user to confirm the NewsletterSignup. The URL will be invalid after 48 hours. |
The request command returns JSON structured like this:
{
"email": "john@doe.com",
"first_name": "John",
"last_name": "Doe",
"country": "US",
"pending_newsletter_signup_url": "http://cd.domain.com/newsletter_signups/pending",
"confirm_newsletter_signup_url": "http://cd.domain.com/newsletter_signups/BAh7CE[...]d747b0/confirm"
}
Affiliates
This endpoint retrieves all affiliate partners of the platform based on the API token.
See endpoint for getting a specific conversion object for more information.
HTTP Request
GET /v1/affiliates
This endpoint retrieves a specific affiliate partner.
HTTP Request
GET /v1/affiliates/:id
This endpoint retrieves a specific affiliate partner.
The request command returns JSON structured like this:
{
"id": 1,
"name": "Affiliate Name",
"param": "affinm",
"created_at": "2017-03-08T15:39:51.719+01:00",
"updated_at": "2017-10-10T10:22:17.232+02:00"
}
This may be only an extract of the provided data. Returned attributes might differ based on access rights.
Affiliate Tracking Links
All affiliate links are always build like .../?utm_source=##param##
(without ##) - where utm_source
is obligatory and used for identifying the affiliate partner, additional optional parameters are:
utm_campaign
utm_medium
tm_term
utm_content
network_id
network_id
is used for all affiliate partners which are networks, e.g. Zanox. This parameter than is the unique identifier for the specific affiliate behind the network.
Affiliate Conversions
This endpoint retrieves all affiliate conversions of the platform based on the API token.
See endpoint for getting a specific conversion object for more information.
HTTP Request
GET /v1/affiliate_conversions
This endpoint retrieves a specific affiliate conversion.
HTTP Request
GET /v1/affiliate_conversion/:id
With each AffiliateConversion you also get data to the associated Affiliate, Investor, Investment. Investment is only present if the conversion was a “Sale” (customer invested) - otherwise, if only Investor is present, the conversion was a “Lead” (= customer registered).
The request command returns JSON structured like this:
{
"id": 25,
"created_at": "2017-04-12T10:59:21.032+02:00",
"affiliate": {
"id": 18,
"name": "Demo Partner"
},
"utm_source": "demo",
"utm_medium": "banner_big3",
"utm_campaign": "test",
"utm_term": null,
"utm_content": null,
"network_id": "xhkekweroj123",
"investor": {
"id": 312,
"reference": "LD12345",
"email_confirmed": true
},
"investment": {
"id": 431,
"reference": "LD123457991",
"amount": "500.0",
"state": "pending"
}
}
Status of Lead/Sale
Investor.email_confirmed
lets you determine if the customers has already gone through the double-opt-in process, so you can descide when the lead is “valid”.
If the conversion is a sale you can use Investment.state
to determine in which status the Investment is, you would only like to pay comission on running Investments. Possible states are:
pending (still waiting for payin)
running (money received, all good)
canceled (something was wrong)
settled (finished and repaid investment)
UTM Parameters & NetworkID
The utm_
attributes let you know which parameters where used in the affiliate link originally. Those links are always build like .../?utm_source=partner-id&utm_...
- where utm_source
is obligatory and used for identifying the affiliate partner, all other parameters are optional.
network_id
is used for all affiliate partners which are networks, e.g. Zanox. This parameter than is the unique identifier for the specific affiliate behind the network.
This endpoint creates an affiliate conversion.
You would normally only use this endpoint to create an affiliate conversion for a the registration of the investor. This will happen in case you handled it by yourself over the API and thus we cannot track the corresponding conversion.
The request returns the AffiliateConversion object after successful creation, see the previous section.
HTTP Request
POST /v1/affiliate_conversions
Possible values to send in your JSON request are:
Parameter | Type | Required? | Description |
---|---|---|---|
affiliate_id | Integer | required | The affiliate that gets paid for this conversion. |
investor_id | Integer | required | The investor, required in any case whether the conversion is a lead or a sale. |
investment_id | String | optional | The investment is only needed if the conversion was a sale with connection to an investment. |
utm_source | String | optional | utm_ value as saved in your tracking cookie, see Google for more information. |
utm_medium | String | optional | utm_ value as saved in your tracking cookie, see Google for more information. |
utm_campaign | String | optional | utm_ value as saved in your tracking cookie, see Google for more information. |
utm_term | String | optional | utm_ value as saved in your tracking cookie, see Google for more information. |
utm_content | String | optional | utm_ value as saved in your tracking cookie, see Google for more information. |
network_id | Boolean | optional | only needed if the affiliate is a network, see our admin panel for further information. |
Adequacy Audits
This endpoint retrieves all AdequacyAudits of the platform based on the API token.
See endpoint for getting a specific AdequacyAudit object for more information.
HTTP Request
GET /v1/adequacy_audits
This endpoint retrieves a specific AdequacyAudit.
HTTP Request
GET /v1/adequacy_audits/:id
AdequacyAudit = “Angemessenheitsprüfung” (or “Anlegerexploration” in the old system). This is a special legal requirement that may only effect German emissions.
The request command returns JSON structured like this:
{
"id": 1,
"investor_id": 1,
"investment_id": 1,
"created_at": "2017-11-12T14:36:16.000+01:00",
"score": "9.6",
"template": "Frankfurter Standard",
"current_job": null,
"current_job_finance": "Leitende Funkion Finanzabteilung",
"past_job": "Sachbearbeiter Depotbank",
"past_job_finance": null,
"education": "Universität",
"categories": {
"Nachrangdarlehen": {
"volume": "up_to_5000",
"knowledge": "knowledge_existing",
"consulting": "asset_management",
"experience": "more_than_3_years",
"transactions": "1_to_5"
},
"Offene Fonds und ETFs": {
"volume": "5000_to_10000",
"knowledge": "knowledge_existing",
"consulting": "no_consulting",
"experience": "more_than_3_years",
"transactions": "more_than_15"
},
"Anleihen": {
"volume": null,
"knowledge": "no_knowledge_existing",
"consulting": null,
"experience": null,
"transactions": null
},
"...": {}
}
}
Parameters
The AdequacyAudit belongs to an Investment in which investment process the AdequacyAudit questionnaire was taken. To get easier connection to an Investor we added the investor_id. If an Investor did an AdequacyAudit once, the old values will be loaded up during the next investment process.
That means you will end up receiving multiple AdequacyAudits for each Investor - be sure to include only the latest AdequacyAudit in your analysis, unless you want to have a deeper look at the differences between an Investors multiple AdequacyAudits.
Other object parameters:
Parameter | Description |
---|---|
score | This score gets calculated by our intern algorithms and determines if a risk notice during the investment process gets shown to the user or not. |
template | Each AdequacyAudit usses a specific AdequacyAuditTemplate for the questionnaire for the investor - this can lead to different category names, all other questions remain the same. In 99% of all cases the standard template “Frankfurter Standard” will be used. |
jobs | These fields show the current and past jobs of the investor. For current and past there are each additional x_finance fields. This is due to the setup of the questionnaire which allows the investor to either enter an own job description or select a job in finance-jobs-dropdown (which gets extra points for the scoring). |
education | Free text field for the investor to enter education information. |
categories | Each category represents a type of asset class for which the user gets asked about his experience (if ever traded), knowledge (knows about it in general), volume (of trades), consulting (if used external advise) and transactions (number of transaction per year). |
Possible values & German translations
To give some values more sense and to know all possible values, we provide the according German translations:
Value | Translation |
---|---|
sub-categories |
|
knowledge | “Kenntnisse” |
experience | “Erfahrungen” |
transactions | “Transaktionen pro Jahr” |
volume | “Summe pro Investment” |
consulting | “Genutzte Beratung” |
knowledge answers |
|
knowledge_existing | “Kenntnisse vorhanden” |
no_knowledge_existing | “keine Kenntnisse vorhanden” |
experience answers |
|
up_to_3_years | “bis zu 3 Jahre” |
more_than_3_years | “mehr als 3 Jahre” |
no_experience | “keine Erfahrungen” |
no_statement | “keine Angabe” |
transactions answers |
|
1_to_5 | “1 bis 5” |
6_to_15 | “6 bis 15” |
more_than_15 | “mehr als 15” |
volume answers |
|
up_to_5000 | “bis 5.000” |
5000_to_10000 | “5.000 bis 10.000” |
more_than_1000 | “über 10.000” |
consulting answers |
|
no_consulting | “beratungsfrei” |
investment_advisory | “Anlageberatung” |
asset_management | “Vermögensverwaltung” |
Please contact us if you got further questions understanding this endpoint.
Bonus Code Entry
BonusCodeEntries are what your investors enter during the investment process as a code for some extra bonus or other additional credit.
An Investment can only have ONE associated BonusCodeEntry.
This endpoint retrieves all BonusCodeEntries of the platform based on the API token.
See endpoint for getting a specific BonusCodeEntry object for more information.
HTTP Request
GET /v1/bonus_code_entries
This endpoint retrieves a specific BonusCodeEntry.
HTTP Request
GET /v1/bonus_code_entries/:id
Object attributes should be self-explanatory or will be documented otherwise here.
The request command returns JSON structured like this:
{
"id": 1,
"investment_id": 2,
"code": "ABC123XYZ",
"state": "pending",
"created_at": "2019-03-12T17:12:15.456+01:00",
"updated_at": "2019-03-12T17:12:15.456+01:00"
}
This may be only an extract of the provided data. Returned attributes might differ based on access rights.
A BonusCodeEntry can have different states: | |
---|---|
State | Description |
pending | the BonusCodeEntry is created with this state |
settled | the BonusCodeEntry was confirmed and the payout / bonus distributed to the user |
rejected | the BonusCodeEntry was denied for some reason (abuse, wrong code, ...) |
You can only change states from pending to settled or pending to rejected.
Use the associated PUT requests:
HTTP Request
PUT /v1/bonus_code_entries/:id/settle
PUT /v1/bonus_code_entries/:id/reject
A successful request will return HTTP Code 200 with the BonusCodeEntry in its new state.
Wrong PUT requests will raise HTTP 422 Unprocessable Entity
.