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.

Get a Platform:

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.
CODE

Projects

Get all Project:

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

Get a Project:

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.

CODE
Get Investments for a Project:

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

Get ProjectPayouts:

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.

CODE

Emissions

Get all Emission:

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

Get a Emission:

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.
CODE

Issuers

Get all Issuer:

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

Get a Issuer:

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.
CODE

Investors

Get all Investor:

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.

Get an Investor:

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.

CODE
Authenticate an Investor

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

email

investors email address

password

investors password

Login an Investor:

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",
  "...": "..."
}

CODE

Get Investments for an Investor:

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

Create an Investor:

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”

email

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.
CODE
Update an Investor

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.

Delete an Investor:

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

Get all Investment:

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

Get an Investment:

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.
CODE

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:

  1. User enters his email and optionally name and country and submits the form

  2. User sees a “thanks we got it, please check your mails” message

  3. Mail is send to the user

  4. When user clicks the confirmation link, a “thanks you are now subscribed” message is shown

  5. 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

Create a NewsletterSignup:

HTTP Request

POST /v1/newsletter_signups

POST Parameters

Parameter

Type

Description

email

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"
}
CODE

Affiliates

Get all 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

Get an Affiliate:

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.

CODE

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

Get all AffiliateConversions:

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

Get a AffiliateConversion:

This endpoint retrieves a specific affiliate conversion.

HTTP Request

GET /v1/affiliate_conversion/:id

With each AffiliateConversion you also get data to the associated  AffiliateInvestorInvestment. 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"
  }
}

CODE

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.

Create an AffiliateConversion:

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

Get all AdequacyAudits:

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

Get a AdequacyAudit:

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
      },
      "...": {}
  }
}

CODE

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).
There can always only be a value in either current_job or current_job_finance.

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).
The category name represents the asset class, the name is set by the corresponding AdequacyAuditTemplate, thats why they occur in German language. The “Frankfurter Standard” has 7 categories in total.
For each category the answers of the investor are shown in the specific area. A null value indicates that the investor did not choose any possible answer at all, which is a differenct than if the investor chooses “no_knowledge_existing” on purpose.

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.

Get all BonusCodeEntries:

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

Get a BonusCodeEntry:

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.
CODE
State of BonusCodeEntry:

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.