API for organizers.

1. Presentation

The Evenium API is a RESTful API which attempts to conform to the design principle of Representational State Transfer.

The api is a RESTful resource accessible via HTTP:

  • a base url: https://evenium.com/api/1/

  • get resources using GET method

  • create new resources with POST

  • remove resources with DELETE

  • update (or create when resource does not exist) using PUT

  • errors are signaled using HTTP code greater than 299 (and answer body may contain an entity describing the error)

API requires authentication. User must log in to retrieve an access token which needs to be propagated with subsequent requests. Access token propagation is done via custom header X-Evenium-Token :

https://evenium.com/api/some_method?some_param=xxx
X-Evenium-Token: {token}

Answers / requests data format is XML or JSON.

2. Api at a glance

2.1. How to test ?

For GET queries you can directly type urls in your web browsers.

For other queries, you may:

2.2. Working in json

API supports both xml and json content type.

  1. in order to receive json content from the server, you need to specify a Accept: application/json request header

  2. whenever sending json content, you need to specify a Content-Type: application/json request header

As an alternative, you can also postfix resources with .json. e.g: https://evenium.com/api/1/events.json?login=xxxx

2.3. Connecting

Use of API requires authentification. You need to pass an accessToken parameter with your requests.

The simplest way to get such a token is to get it from your profile.

If you have a Facility account, go to:

Or, if you are using evenium.net platform:

You can only use HTTPS for your API call.

2.4. Contacts

The 'address book' of the user.

Contacts are identified by an internal (Evenium) id. They can also be identified using a custom (external, user specific) id.

Contacts have predefined properties as well as dynamic fields. Fields are identified by a name, usually self-descriptive, sometimes a simple numerical code.

Below, an example of how to import some contacts.

Request:
PUT https://evenium.com/api/1/contacts
{
    "contact": [
      {
        "customId": "TEST-4",
        "firstName": "John",
        "lastName": "December",
        "title": "MISS",
        "email": "arnaud@evenium.com",
        "company": "F&C UK",
        "field": [
          {
            "name": "FIXED_PHONE_NUMBER",
            "value": "0147701506"
          },
          {
            "name": "1032349",
            "value": "Dinesh jain"
          }
        ]
      },
      {
        "id": "100000210004",
        "customId": "TEST-5",
        "firstName": "Sophie",
        "lastName": "Bizeau",
        "title": "MRS",
        "email": "christophe@evenium.com",
        "company": "F&C France",
        "field": {
          "name": "FUNCTION",
          "value": "Medical advisor"
        }
      }
    ]
}

2.5. Working with guests

Guests are contacts that have been invited to an event.

They have a main registration status to the event (see Guest status).

They can possibly have event specific fields.

Look for an event, which title contains “convention” and starts after June 2010 :

Request:
GET https://evenium.com/api/1/events?title=convention&since=2010-06-01Z
Response:
{
    "nbrResults": "2",
    "maxResults": "100",
    "firstResult": "0",
    "more": "false",
    "event": [
      {
        "id": "7623",
        "title": "Vinci Energies convention",
        "startDate": "2010-07-10T07:00:00.000Z",
        "endDate": "2010-07-12T17:00:00.000Z",
        "creationDate": "2009-12-12T10:08:26.000Z",
        "status": "FUTURE"
      },
      {
        "id": "8424",
        "title": "Convention Citroën",
        "startDate": "2010-06-15T06:00:00.000Z",
        "endDate": "2010-06-17T16:00:00.000Z",
        "creationDate": "2005-10-24T13:38:06.000Z",
        "status": "FUTURE"
      }
    ]
}

Then look for a guest named “smith”, invited to the event “Convention Citroën” :

Request:
GET https://evenium.com/api/1/events/8424/guests?lastName=smith
Response:
{
    "nbrResults": "1",
    "maxResults": "100",
    "firstResult": "0",
    "more": "false",
    "guest": {
      "contactId": "1997252",
      "eventId": "8424",
      "firstName": "Bob",
      "lastName": "SMITH",
      "title": "MR",
      "email": "noreply@evenium.com",
      "company": "Evenium",
      "lastUpdate": "2010-04-02T17:21:53.000Z",
      "status": "UNANSWERED",
      "category": "1010",
      "categoryLabel": "Organizor",
      "field": [
        {
          "name": "ADDR_COUNTRY",
          "value": "UK"
        },
        {
          "eventOnly": "true",
          "name": "COMMENTS",
          "value": "I'm currently on the Dukan diet.
Please propose me a dinner menu accordingly"
        }
      ]
    }
 }

And then force his registration status to CONFIRMED

Request:
PUT https://evenium.com/api/1/events/8424/guests/1997252/status
Content-Type: application/x-www-form-urlencoded
status=CONFIRMED

2.6. Synchronizing your CRM with Evenium

Scenario 1: periodically send new guests only to EVENIUM

Request:
PUT https://evenium.com/api/1/events/{eventId}/guests?mode=CREATE_ONLY

EventId may be Evenium event id OR your own event id prefixed:

PUT https://evenium.com/api/1/events/ext:MD-1325239/guests?mode=CREATE_ONLY
{
    "guest": [
      {
        "firstName": "Bob",
        "lastName": "Smith",
        "title": "MR",
        "email": "noreply@evenium.com",
        "company": "Evenium"
      },
      {
        "firstName": "Samantha",
        "lastName": "Doe",
        "title": "MRS",
        "email": "noreply@evenium.com",
        "company": "Evenium"
      }
    ]
}
Response:
 {
    "processed": "2",
    "created": "1",
    "messages": [
      {
        "status": "ERROR",
        "context": "Guest: Bob Smith",
        "details": "Unable to create guest, duplicate found: 10001025205 - Bob Smith"
      },
      {
        "status": "INFO",
        "context": "Guest: Samantha Doe",
        "details": "Successfully created"
      }
    ]
}

Scenario 2: real-time integration

Either periodically poll Evenium for updates:

Request:
GET https://evenium.com/api/1/events/8424/guests?lastUpdate=2010-11-06T22:00:00+00:01

Or, if possible, when one of your users open a guest form on your CRM, fetch info for Evenium using your CRM internal IDs:

Request:
GET https://evenium.com/api/1/events/ext:MD-1325239/guests/ext:AF-40J7828C1

Either case, once the user submit changes on your CRM, update Evenium database:

Request:
PUT https://evenium.com/api/1/events/ext:MD-1325239/guests/ext:AF-40J7828C1
{
	"email": "new-email@new-company.com",
	"company": "New company"
}

3. Contacts

3.1. Contact resources ids

Resources of type contact are accessed by contactId, referred as {contactId} path parameter in the resource url.

{contactId} can be of two kinds:

Evenium contact’s id

e.g.: …​/contacts/123456/…​

or …​/contacts/id:123456/…​

Your CRM’s contact id

You can add a property _customId" to your contacts. You can also access your contacts through this id:

e.g.: …​/contacts/ext:TE567890/…​

3.2. Get contact

URL

/api/1/contacts/{contactId}

method

GET

response body

{
    "id": "147135",
    "customId": "TE567890",
    "firstName": "Robert",
    "lastName": "Gérard",
    "gender": "MALE",
    "email": "basetest@evenium.com",
    "company": "Acme Industrie SA",
    "fields": [
      {
        "name": "FUNCTION",
        "value": "Manager"
      },
      {
        "name": "GENERIC_PHONE_NUMBER",
        "value": "0666666666"
      },
      {
        "name": "FIXED_PHONE_NUMBER",
        "value": "0111111111"
      },
      {
        "name": "MOBILE_PHONE_NUMBER",
        "value": "0666666666"
      },
      {
        "name": "FAX_NUMBER",
        "value": "0100000000"
      },
      {
        "name": "ADDR_STREET_NAME",
        "value": "2 impasse du Coupe-jarret"
      },
      {
        "name": "ADDR_POSTAL_CODE",
        "value": "75002"
      },
      {
        "name": "ADDR_CITY",
        "value": "Paris"
      },
      {
        "name": "ADDR_COUNTRY",
        "value": "France"
      },
      {
        "name": "COMPANY_DEPT",
        "value": "General Management"
      },
      {
        "name": "1004652",
        "value": "2010-05-30"
      }
    ]
}

3.3. Get contact by custom id

custom id = id specific to your database

URL

/api/1/contacts/customId/{customId}

method

GET

response body

{
    "id": "147135",
    "customId": "TE567890",
    "firstName": "Robert",
    "lastName": "Gérard",
    "gender": "MALE",
    "email": "basetest@evenium.com",
    "company": "Acme Industrie SA",
    "fields": [
      {
        "name": "FUNCTION",
        "value": "Manager"
      },
      {
        "name": "GENERIC_PHONE_NUMBER",
        "value": "0666666666"
      },
      {
        "name": "FIXED_PHONE_NUMBER",
        "value": "0111111111"
      },
      {
        "name": "MOBILE_PHONE_NUMBER",
        "value": "0666666666"
      },
      {
        "name": "FAX_NUMBER",
        "value": "0100000000"
      },
      {
        "name": "ADDR_STREET_NAME",
        "value": "2 impasse du Coupe-jarret"
      },
      {
        "name": "ADDR_POSTAL_CODE",
        "value": "75002"
      },
      {
        "name": "ADDR_CITY",
        "value": "Paris"
      },
      {
        "name": "ADDR_COUNTRY",
        "value": "France"
      },
      {
        "name": "COMPANY_DEPT",
        "value": "General Management"
      },
      {
        "name": "1004652",
        "value": "2010-05-30"
      }
    ]
}

3.4. Create contact

URL

/api/1/contacts

method

POST

contentType

application/xml / application/json

request body

{
    "customId": "TEST-12-234",
    "firstName": "Jessica",
    "lastName": "Golor",
    "gender": "FEMALE",
    "email": "basetest@evenium.com",
    "company": "Acme Industrie SA",
    "fields": [
      {
        "name": "FUNCTION",
        "value": "Manager"
      },
      {
        "name": "GENERIC_PHONE_NUMBER",
        "value": "0666666666"
      },
      {
        "name": "FIXED_PHONE_NUMBER",
        "value": "0111111111"
      },
      {
        "name": "MOBILE_PHONE_NUMBER",
        "value": "0666666666"
      },
      {
        "name": "COMPANY_DEPT",
        "value": "HR"
      },
      {
        "name": "1004652",
        "value": "2010-02-22"
      }
    ]
}

response body

{
  "contacts": {
    "id": "147135",
    "customId": "TEST-12-234",
    "firstName": "Jessica",
    "lastName": "Golor",
    "gender": "FEMALE",
    "email": "basetest@evenium.com",
    "company": "Acme Industrie SA",
    "fields": [
      {
        "name": "FUNCTION",
        "value": "Manager"
      },
      {
        "name": "GENERIC_PHONE_NUMBER",
        "value": "0666666666"
      },
      {
        "name": "FIXED_PHONE_NUMBER",
        "value": "0111111111"
      },
      {
        "name": "MOBILE_PHONE_NUMBER",
        "value": "0666666666"
      },
      {
        "name": "COMPANY_DEPT",
        "value": "HR"
      },
      {
        "name": "1004652",
        "value": "2010-02-22"
      }
    ]
  }
}

3.5. Update contact

URL

/api/1/contacts/{contactId}

method

PUT

contentType

application/xml / application/json

request body

{
    "email": "basetest@evenium.com",
    "company": "Acme Industrie SA",
    "fields": [
      {
        "name": "MOBILE_PHONE_NUMBER",
        "value": "077777777"
      },
      {
        "name": "COMPANY_DEPT",
        "value": "HR"
      }
    ]
}

3.6. Update contact by custom id

URL

/api/1/contacts/customId

method

PUT

contentType

application/xml / application/json

request body

{
    "email": "basetest@evenium.com",
    "company": "Acme Industrie SA",
    "fields": [
      {
        "name": "MOBILE_PHONE_NUMBER",
        "value": "077777777"
      },
      {
        "name": "COMPANY_DEPT",
        "value": "HR"
      }
    ]
}

3.7. Get all contacts

URL

/api/1/contacts

method

GET

query params

maxResults

max number of results to fetch. Default is 100.

firstResult

index of the first result of the list to fetch. First item of the list index is 0. Default value is 0.

since

only retrieve contacts who have been updated after the given date.

lastName

only retrieve contacts whose lastName is like the given lastName.

firstName

only retrieve contacts whose firstName is like the given firstName.

email

only retrieve contacts whose email is equals to the given email.

company

only retrieve contacts whose company is like the given company.

response body

{
    "nbrResults": "100",
    "maxResults": "100",
    "firstResult": "0",
    "first": "0",
    "next": "100",
    "more": "true",
    "contacts": [
      {
        "id": "147195",
        "customId": "TEST-123-A",
        "firstName": "Tom",
        "lastName": "Janvier",
        "title": "MR",
        "email": "arnaud@evenium.com",
        "company": "BNP Paribas",
        "fields": [
          {
            "name": "FIXED_PHONE_NUMBER",
            "value": "0147701506"
          },
          {
            "name": "1032349",
            "value": "Dinesh jain"
          }
        ]
      },
      {
        "id": "136905",
        "customId": "TEST-345-CB",
        "firstName": "Stéphanie",
        "lastName": "Johanson",
        "gender": "FEMALE",
        "email": "christophe@evenium.com",
        "company": "BNP Paribas",
        "fields": [
          {
            "name": "FUNCTION",
            "value": "Loan Trader"
          },
          {
            "name": "FIXED_PHONE_NUMBER",
            "value": "0147701506"
          },
          {
            "name": "MOBILE_PHONE_NUMBER",
            "value": "0662642555"
          },
          {
            "name": "FAX_NUMBER",
            "value": "0147708536"
          },
          {
            "name": "ADDR_STREET_NAME",
            "value": "555 5th Ave"
          },
          {
            "name": "ADDR_POSTAL_CODE",
            "value": "56230"
          },
          {
            "name": "ADDR_CITY",
            "value": "NY"
          },
          {
            "name": "ADDR_STATE",
            "value": "NY"
          },
          {
            "name": "1032349",
            "value": "David Kreidler"
          }
        ]
      }
    ],
	/* ... */
}

3.8. Import contacts

Create new contacts OR update existing ones.

URL

/api/1/contacts

method

PUT

contentType

application/xml / application/json

request body

{
    "contacts": [
      {
        "customId": "TEST-5008",
        "firstName": "John",
        "lastName": "Doe",
        "gender": "MALE",
        "email": "tom@evenium.com",
        "company": "BNP Paribas",
        "fields": [
          {
            "name": "FIXED_PHONE_NUMBER",
            "value": "0147701506"
          },
          {
            "name": "IMPORT_LAST_UPDATE",
            "value": "2010-05-06
			12:33:01.9
		"
          },
          {
            "name": "1032349",
            "value": "Dinesh jain"
          }
        ]
      },
      {
        "customId": "TEST-5009",
        "firstName": "Gerald",
        "lastName": "Mc Carthy",
        "gender": "MALE",
        "email": "gerald@evenium.com",
        "company": "Total",
        "fields": [
          {
            "name": "FUNCTION",
            "value": "Chief Engineer"
          },
          {
            "name": "MOBILE_PHONE_NUMBER",
            "value": "0600642415"
          }
        ],
        "value": "
		15 / 37
		"
      },
      {
        "customId": "TEST-3080",
        "firstName": "Antoinette",
        "lastName": "de Lariboisière",
        "gender": "FEMALE",
        "email": "adlr@evenium.com",
        "company": "LVMH",
        "fields": {
          "name": "MOBILE_PHONE_NUMBER",
          "value": "0688632912"
        }
      }
    ]
}

response body

{
    "processed": "3",
    "created": "1",
    "messages": [
      {
        "status": "ERROR",
        "context": "Contact custom id: TEST-5008",
        "details": "Unable to create contact, duplicate found: 100000238205 - DOE John"
      },
      {
        "status": "INFO",
        "context": "Contact custom id: TEST-5009",
        "details": "Successfully updated"
      },
      {
        "status": "INFO",
        "context": "Contact custom id: TEST-3080",
        "details": "Successfully updated"
      }
    ]
}

3.9. Get contact’s events

URL

/api/1/contacts/{contactId}/events

method

GET

query params

startsAfter

filters the start date: startDate must be > startsAfter

startsBefore

filters the start date: startDate must be < startsBefore

endsAfter

filters the end date: endDate must be > endsAfter

endsBefore

filters the end date: endDate must be < endsBefore

createdAfter

filters the creation date: creationDate must be > createdAfter

createdBefore

filters the creation date: creationDate must be < createdBefore

response body

[ {
  "id" : 47401,
  "title" : "Conférence annuelle",
  "displayTitle" : "Conférence annuelle",
  "startDate" : "2017-06-02T10:00:00.000Z",
  "endDate" : "2018-09-26T13:00:00.000Z",
  "facets" : [ "SIMPLE_CONNEXME_REGISTRATION_WITH_CODE" ],
  "creationDate" : "2017-05-16T10:04:13.000Z",
  "status" : "FUTURE",
  "code" : "TESTCODE",
  "type" : "FACILITY",
  "registration" : {
    "contactId" : 2084366,
    "personId" : 4201,
    "status" : "CONFIRMED",
    "postStatus" : "PRESENT",
    "category" : {
      "id" : 2005
    },
    "lastUpdate" : "2017-06-09T15:27:02.000Z",
    "creationDate" : "2017-06-05T12:22:30.000Z"
  },
  "webSite" : "http://site.evenium.lc/pro/login/login_inter.jsp?evId=47401&type=guest&login=4JKM8",
  "fields" : [ {
    "name" : "EVENT_INVITATION_MESSAGE",
    "value" : "Test"
  }, {
    "name" : "EVENT_PRE_FORMATED_MESSAGE",
    "value" : "Nouveau Message"
  }, {
    "name" : "LOGO",
    "value" : "/uploads/event_member/47401/logo/logo-20131128-152356.png"
  }, {
    "name" : "MOBILE_LOGO",
    "value" : "/uploads/event_member/47401/logo/mobile_logo.png"
  }, {
    "name" : "EMAIL",
    "value" : "contact@evenium.com"
  }, {
    "name" : "USES_CONNEXME_TV",
    "value" : "true"
  }, {
    "name" : "EVENT_LOCATION_NAME",
    "value" : "5 rue de Balzac"
  }, {
    "name" : "EVENT_HOST_NAME",
    "value" : "Evenium"
  }, {
    "name" : "IS_END_DATE_STORED",
    "value" : "true"
  }, {
    "name" : "PERSONALIZED_SENDER",
    "value" : "Evenium"
  } ],
  "locales" : [ "fr" ]
} ]

3.10. Get contact’s events by custom id

custom id = id specific to your database

URL

/api/1/contacts/customId/{customId}/events

method

GET

query params

startsAfter

filters the start date: startDate must be > startsAfter

startsBefore

filters the start date: startDate must be < startsBefore

endsAfter

filters the end date: endDate must be > endsAfter

endsBefore

filters the end date: endDate must be < endsBefore

createdAfter

filters the creation date: creationDate must be > createdAfter

createdBefore

filters the creation date: creationDate must be < createdBefore

response body

[ {
  "id" : 47401,
  "title" : "Conférence annuelle",
  "displayTitle" : "Conférence annuelle",
  "startDate" : "2017-06-02T10:00:00.000Z",
  "endDate" : "2018-09-26T13:00:00.000Z",
  "facets" : [ "SIMPLE_CONNEXME_REGISTRATION_WITH_CODE" ],
  "creationDate" : "2017-05-16T10:04:13.000Z",
  "status" : "FUTURE",
  "code" : "TESTCODE",
  "type" : "FACILITY",
  "registration" : {
    "contactId" : 2084366,
    "personId" : 4201,
    "status" : "CONFIRMED",
    "postStatus" : "PRESENT",
    "category" : {
      "id" : 2005
    },
    "lastUpdate" : "2017-06-09T15:27:02.000Z",
    "creationDate" : "2017-06-05T12:22:30.000Z"
  },
  "webSite" : "http://site.evenium.lc/pro/login/login_inter.jsp?evId=47401&type=guest&login=4JKM8",
  "fields" : [ {
    "name" : "EVENT_INVITATION_MESSAGE",
    "value" : "Test"
  }, {
    "name" : "EVENT_PRE_FORMATED_MESSAGE",
    "value" : "Nouveau Message"
  }, {
    "name" : "LOGO",
    "value" : "/uploads/event_member/47401/logo/logo-20131128-152356.png"
  }, {
    "name" : "MOBILE_LOGO",
    "value" : "/uploads/event_member/47401/logo/mobile_logo.png"
  }, {
    "name" : "EMAIL",
    "value" : "contact@evenium.com"
  }, {
    "name" : "USES_CONNEXME_TV",
    "value" : "true"
  }, {
    "name" : "EVENT_LOCATION_NAME",
    "value" : "5 rue de Balzac"
  }, {
    "name" : "EVENT_HOST_NAME",
    "value" : "Evenium"
  }, {
    "name" : "IS_END_DATE_STORED",
    "value" : "true"
  }, {
    "name" : "PERSONALIZED_SENDER",
    "value" : "Evenium"
  } ],
  "locales" : [ "fr" ]
} ]

3.11. Remove contact

Be extremely wary if you want to use this api:

  • deleting a contact deletes all associated guests in cascade

  • deletion is permanent, no going back possible

URL

/api/1/contacts/{contactId}

method

DELETE

response status

204

removal succeeded.

4. Events

4.1. Event resources ids

Resources of type event are accessed by eventId, referred as {eventId} path parameter in the resource url.

{eventId} can be of two kinds:

Evenium event’s id

e.g.: …​/events/123456/…​

or …​/events/id:123456/…​

Your CRM’s event id

You can add a field EXT_EVENT_ID to your events. You can also access your events through this id:

e.g.: …​/events/ext:EV-AB12CD34/…​

4.2. Get event

URL

/api/1/events/{eventId}

method

GET

response body

{
	"id": "12458",
	"title": "Séminaire fondation",
	"description": "Séminaire pour le lancement du produit JKLM",
	"startDate": "2018-04-21T14:25:00.000Z",
	"endDate": "2018-05-21T14:25:00.000Z",
	"status": "OPEN",
	"url": "/site/seminaire-fondation",
	"fields": [{
		"value": "National congress",
		"name": "EVENT_TYPE"
	},{
		"value": "EV-AB12CD34",
		"name": "EXT_EVENT_ID"
	}]
}

4.3. Get all events

URL

/api/1/events

method

GET

query params

maxResults

max number of results to fetch. Default is 100.

firstResult

index of the first result of the list to fetch. First item of the list index is 0. Default value is 0.

startsAfter

only retrieve events which starts after the given date.

startsBefore

only retrieve events which starts before the given date.

endsAfter

only retrieve events which starts after the given date.

endsBefore

only retrieve events which starts before the given date.

createdAfter

only retrieve events which have been created after the given date.

createdBefore

only retrieve events which have been created before the given date.

title

only retrieve events which title is like the given title.

status

only retrieve events which status is equal to the given status.

response body

{
    "nbrResults": "2",
    "maxResults": "100",
    "firstResult": "0",
    "more": "false",
    "event": [
      {
        "id": "12458",
        "title": "Séminaire fondation",
        "description": "Séminaire pour le lancement du produit JKLM",
        "startDate": "2010-04-28T08:00:00.000+02:00",
        "endDate": "2010-04-29T18:00:00.000+02:00",
        "creationDate": "2010-04-02T12:33:01.000+02:00",
        "status": "OPEN",
        "url": "/site/seminaire-fondation"
      },
      {
        "id": "16083",
        "title": "Colloque : valoriser et transférer les résultats de la recherche",
        "description": "Séjour au Club Med la Palmyre 600 personnes
Anniversaire des 15 ans de la société Arval Phh",
        "startDate": "2010-06-28T08:00:00.000+02:00",
        "endDate": "2010-06-31T18:00:00.000+02:00",
        "creationDate": "2010-04-02T13:02:51.000+02:00",
        "status": "OPEN",
        "url": "/site/colloque-valoriser-et-transferer-les-resultats-de-larecherche"
      }
    ]
}

4.4. Create Events

Event creation is only available via a v2 api

URL

/api/2/member/events

method

POST

query params

cloningOptions

cloning options, zero to one of the following, comma separated:

  • ALL_EVENT_PARTS

  • ACTIVITIES

  • PROGRAM

  • LOCATIONS

  • REDUCTION_CODES

  • EMAILS

  • DOCUMENTS

request body

{
	"title": "International seminar",
	"description": "International seminar for young executives from Europe",
    "startDate": "2018-04-21T14:25:00.000Z",
    "endDate": "2018-05-21T14:25:00.000Z",
    "location": {
		 "name": "Saint-Lazare congress hall",
		  "street": "9 Rue Saint-Lazare",
        "city": "Paris",
		  "countryCode": "FR"
    },
    "moduleConfigs": [
        "EVENT_CONNEXME", "EVENT_GUEST_EXPENSES", "EVENT_ONSITE"
    ]
}

response body

{
	"id": "12458",
	"title": "Séminaire fondation",
	"description": "Séminaire pour le lancement du produit JKLM",
	"startDate": "2018-04-21T14:25:00.000Z",
	"endDate": "2018-05-21T14:25:00.000Z",
	"status": "OPEN",
	"url": "/site/seminaire-fondation",
	"fields": [{
		"value": "National congress",
		"name": "EVENT_TYPE"
	},{
		"value": "EV-AB12CD34",
		"name": "EXT_EVENT_ID"
	}]
}

For list of available moduleConfigs, see Optional modules.

5. Guests

5.1. Guest resources ids

Resources of type guest are accessed by eventId and contact_id (referred as _{eventId} and {contactId} path parameter in the resource url).

both can be of two kinds:

  • Evenium contact’s id

  • Your CRM’s contact id

Please see Event resources ids and Contact resources ids for more details.

5.2. Get guest

URL

/api/1/events/{eventId}/guests/{contactId}
/api/1/events/{eventId}/guests/guestCode/{guestCode}

method

GET

query params

fields

associated guest properties to retrieve, comma separated:

  • REGISTRATION: all guest’s registrations

  • PRESENCE: guest presence info

  • SIGNATURE: guest signatures (event, sessions)

e.g: fields=REGISTRATION,PRESENCE

response body

{
	"contactId": "1102365",
	"customId": "09f3210a-a1d4-11e7-abc4-cec278b6b50a",
	"eventId": "10564",
	"guestCode": "D4571",
	"firstName": "Ramikha",
	"lastName": "MARKOF",
	"gender": "FEMALE",
	"email": "noreply@evenium.com",
	"lastUpdate": "2008-04-18T12:51:01.000Z",
	"status": "CONFIRMED",
	"category": {
		"id": 1010,
		"label": "Customer"
	},
	"fields": [{
		"name": "ADDR_POSTAL_CODE",
		"value": "75009"
	},{
		"name": "ADDR_CITY",
		"value": "Paris"
	},{
		"eventOnly": "true",
		"name": "COMMENTS",
		"value": "Looks perfect to me !"
	},{
		"eventOnly": "true",
		"name": "TRANSPORT_WAYTO_DEPARTURE_DATA_SOURCE",
		"value": "MANUAL"
	},{
		"eventOnly": "true",
		"name": "TRANSPORT_WAYTO_ARRIVAL_DATA_SOURCE",
		"value": "MANUAL"
	},{
		"eventOnly": "true",
		"name": "TRANSPORT_WAYTO_ARRIVAL_TYPE",
		"value": "train"
	}]
}

5.3. Create guest

Invite a contact on an event.

URL

/api/1/events/{eventId}/guests

method

POST

request body

Invite an existing contact (status is optional)

{
	"contactId": 12563697,
	"status": "UNANSWERED"
}

Create a guest from scratch (status is optional as well)

{
	"firstName": "Vladimir",
	"lastName": "Oulianov",
	"email": "vladimir.oulianov@globalone.com",
	"gender": "MALE",
	"company": "GlobalOne",
	"status": "CONFIRMED"
}

5.4. Update guest

URL

/api/1/events/{eventId}/guests/{contactId}

method

PUT

request body

{
	"email": "noreply@evenium.com",
	"company": "EVENIUM",
	"lastUpdate": "2009-10-06T18:01:08.000Z",
	"status": "DECLINED",
	"category": {
	 "id": 1010
	},
	"fields": [{
	  "name": "ADDR_CITY",
	  "value": "PARIS"
	},{
	  "name": "IMPORT_FLAG",
	  "value": "Y"
	},{
	  "name": "ADDR_STREET_NAME",
	  "value": "2, rue de sèze"
	},{
	  "name": "1005064",
	  "value": "Ile de france"
	},{
	  "name": "1005096",
	  "value": "3EME Etage"
	},{
	  "name": "ADDR_POSTAL_CODE",
	  "value": "75009"
	}]
}

5.5. Update guest photo

URL

/api/1/events/{eventId}/guests/{contactId}/photo

method

PUT

contentType

text/plain

request body

Image using data URI scheme.

See:

data:[<mediatype>];base64,<data>

Supported media types:

  • image/jpeg

  • image/png

  • image/gif

5.6. Get guest status

URL

/api/1/events/{eventId}/guests/{contactId}/status

method

GET

response body

{
	"contactId": "2000859",
	"eventId": "37984",
	"status": "CANCELED"
}

5.7. Update guest status

URL

/api/1/events/{eventId}/guests/{contactId}/status

method

PUT

contentType

application/x-www-form-urlencoded

form params

status (required)

the new value of the status.

5.8. Get guest post status

URL

/api/1/events/{eventId}/guests/{contactId}/postStatus

method

GET

response body

{
	"contactId": "2000859",
	"eventId": "37984",
	"postStatus": "PRESENT"
}

5.9. Update guest post status

URL

/api/1/events/{eventId}/guests/{contactId}/postStatus

method

PUT

contentType

application/x-www-form-urlencoded

form params

value (required)

the new value of the post status.

lastUpdate

the date the status is updated

5.10. Get all guests

URL

/api/1/events/{eventId}/guests

method

GET

query params

maxResults

max number of results to fetch. Default is 100.

firstResult

index of the first result of the list to fetch. First item of the list index is 0. Default value is 0.

status

only retrieve guests whose status is equal to the given status.

since

only retrieve guests who have been updated after the given date.

until

only retrieve guests who have been updated until/before the given date.

lastName

only retrieve guests whose lastName is like the given lastName.

firstName

only retrieve guests whose firstName is like the given firstName.

email

only retrieve guests whose email is equals to the given email.

company

only retrieve guests whose company is like the given company.

response body

{
	"nbrResults": "3",
	"maxResults": "100",
	"firstResult": "0",
	"more": "false",
	"guests": [{
		"contactId": "1003525",
		"eventId": "10574",
		"firstName": "Sophie",
		"lastName": "SERES",
		"gender": "FEMALE",
		"email": "noreply@evenium.com",
		"company": "EVENIUM",
		"lastUpdate": "2009-10-06T18:01:08.000Z",
		"status": "DECLINED",
		"category": "1010",
		"categoryLabel": "Organizor",
		"fields": [{
			"name": "ADDR_CITY",
			"value": "PARIS"
		},{
			"name": "IMPORT_FLAG",
			"value": "Y"
		},{
			"name": "ADDR_STREET_NAME",
			"value": "2, rue de sèze"
		},{
			"name": "1005064",
			"value": "Ile de france"
		},{
			"name": "1005096",
			"value": "3EME Etage"
		},{
			"name": "ADDR_POSTAL_CODE",
			"value": "75009"
		},{
			"eventOnly": "true",
			"name": "1012983",
			"value": "Good"
		},{
			"eventOnly": "true",
			"name": "1013008",
			"value": "Fair"
		},{
			"eventOnly": "true",
			"name": "1013003",
			"value": "Very good"
		},{
			"eventOnly": "true",
			"name": "1012996",
			"value": "Good"
		},{
			"eventOnly": "true",
			"name": "1013007",
			"value": "Good"
		},{
			"eventOnly": "true",
			"name": "1012994",
			"value": "Good"
		},{
			"eventOnly": "true",
			"name": "1012993",
			"value": "Very good"
		},{
			"eventOnly": "true",
			"name": "1013005",
			"value": "Very good"
		},{
			"eventOnly": "true",
			"name": "1012982",
			"value": "Very good"
		},{
			"eventOnly": "true",
			"name": "1012986",
			"value": "Poor"
		},{
			"eventOnly": "true",
			"name": "1012995",
			"value": "Very good"
		},{
			"eventOnly": "true",
			"name": "1013004",
			"value": "Good"
		}]
	},{
		"contactId": "2005623",
		"eventId": "10574",
		"firstName": "Laurence",
		"lastName": "BOTTA",
		"gender": "FEMALE",
		"email": "noreply@evenium.com",
		"lastUpdate": "2008-04-17T10:28:10.000Z",
		"status": "CONFIRMED",
		"category": "1010",
		"categoryLabel": "Organizor",
		"fields": [{
			"name": "ADDR_POSTAL_CODE",
			"value": "92200"
		},{
			"name": "ADDR_STREET_NAME",
			"value": "7 Villa Hassay"
		},{
			"name": "ADDR_CITY",
			"value": "Neuilly"
		},{
			"eventOnly": "true",
			"name": "COMMENTS",
			"value": "ok"
		}]
	},{
		"contactId": "1236592",
		"eventId": "20564",
		"firstName": "George",
		"lastName": "LONGAT",
		"gender": "MALE",
		"email": "noreply@evenium.com",
		"lastUpdate": "2008-05-20T13:18:07.000Z",
		"status": "CONFIRMED",
		"category": "1030",
		"categoryLabel": "Customer",
		"fields": [{
			"name": "ADDR_POSTAL_CODE",
			"value": "75014"
		},{
			"name": "ADDR_CITY",
			"value": "PARIS"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYBACK_ARRIVAL_DATA_SOURCE",
			"value": "MANUAL"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_ARRIVAL_TIME_ONLY",
			"value": "2008-11-28 10:25:00.0"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYBACK_DEPARTURE_DATE_ONLY",
			"value": "2008-12-06"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_ARRIVAL_TRANSFER",
			"value": "y"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_DEPARTURE_DATE_ONLY",
			"value": "2008-11-28 08:00:00.0"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYBACK_DEPARTURE_TYPE",
			"value": "car"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_ARRIVAL_TERMINAL",
			"value": "W"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_ARRIVAL_TO",
			"value": "Paris, Orly"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_ARRIVAL_DATA_SOURCE",
			"value": "GDS"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_ARRIVAL_DATE_ONLY",
			"value": "2008-11-28 10:25:00.0"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_ARRIVAL_NUMBER",
			"value": "5019"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_DEPARTURE_DATA_SOURCE",
			"value": "GDS"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_DEPARTURE_FROM",
			"value": "London airport"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_DEPARTURE_TIME_ONLY",
			"value": "2008-11-28 08:00:00.0"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_ARRIVAL_TYPE",
			"value": "vol"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYTO_ARRIVAL_CARRIER",
			"value": "Air France"
		},{
			"eventOnly": "true",
			"name": "TRANSPORT_WAYBACK_DEPARTURE_DATA_SOURCE",
			"value": "MANUAL"
		}]
	}]
}

5.11. Import guests

Create new guests OR update existing ones.

URL

/api/1/events/{eventId}/guests

method

PUT

query params

mode

Import mode:

  • MERGE (default): if guest already exists, update it with given data

  • CREATE_ONLY: if guest already exist, do not update it

response body

{
	"guests": [{
		"customId": "TEST-123-A",
		"firstName": "Tom",
		"lastName": "Janvier",
		"gender": "MALE",
		"email": "tom@evenium.com",
		"company": "BNP Paribas",
		"category": "VIP",
		"fields": [{
			"name": "FIXED_PHONE_NUMBER",
			"value": "0147701506"
		}]
	},{
		"customId": "TEST-345-CB",
		"firstName": "Gerald",
		"lastName": "Mc Carthy",
		"gender": "FEMALE",
		"email": "gerald@evenium.com",
		"company": "Total",
		"fields": [{
			"name": "MOBILE_PHONE_NUMBER",
			"value": "0600642415"
		},{
			"eventOnly": "true",
			"name": "COMMENTS",
			"value": "ok"
		}]
   },{
		"contactId": "235648",
		"status": "CANCELED"
	}]
 }

6. Event Parts / Sessions

6.1. Get event part

URL

/api/1/events/{eventId}/eventParts/{eventPartId}

method

GET

response body

{
	"eventId":52671,
	"id":1000013872008,
	"title":"Analysez vos flux de données en temps reel",
	"displayTitle":"Analysez vos flux de données en temps reel",
	"startDate":"2015-07-09T07:00:00.000Z",
	"endDate":"2015-07-09T08:00:00.000Z",
	"nature":"EDITORIAL",
	"code":"EVID1000013872008",
	"lastUpdate":"2014-07-09T12:37:40.000Z",
	"location":{
		"id":"693005",
		"name":"Salle 1",
		"eventId":52671,
		"lastUpdate":"2014-07-25T22:13:29.602Z"
	},
	"fields":[{
		"name":"SHARING_IS_NOT_ALLOWED",
		"value":"true"
	}]
}

6.2. Get all event parts

URL

/api/1/events/{eventId}/eventParts/{eventPartId}

method

GET

query params

maxResults

max number of results to fetch. Default is 100.

firstResult

index of the first result of the list to fetch. First item of the list index is 0. Default value is 0.

startsAfter

only retrieve event parts which starts after the given date.

startsBefore

only retrieve event parts which starts before the given date.

endsAfter

only retrieve event parts which starts after the given date.

endsBefore

only retrieve event parts which starts before the given date.

updatedAfter

only retrieve event parts which have been updated after the given date.

updatedBefore

only retrieve event parts which have been updated before the given date.

title

only retrieve event parts which title is like the given title.

response body

{
	"nbrResults":23,
	"maxResults":100,
	"firstResult":0,
	"first":"0",
	"more":false,
	"eventParts":[{
		"eventId":52671,
		"id":1000013872008,
		"title":"Conférence 1",
		"displayTitle":"Conférence 1",
		"startDate":"2015-07-09T07:00:00.000Z",
		"endDate":"2015-07-09T08:00:00.000Z",
		"nature":"EDITORIAL",
		"code":"EVID1000013872008",
		"lastUpdate":"2014-07-09T12:37:40.000Z",
		"location":{
			"id":"693005",
			"name":"Salle 1",
			"eventId":52671,
			"lastUpdate":"2014-07-25T22:13:29.602Z"
		},
		"fields":[{
			"name":"SHARING_IS_NOT_ALLOWED",
			"value":"true"
		}]
	},{
		"eventId":52671,
		"id":1000013872009,
		"title":"Conférence 2",
		"displayTitle":"Conférence 2",
		"startDate":"2015-07-09T08:00:00.000Z",
		"endDate":"2015-07-09T09:00:00.000Z",
		"nature":"EDITORIAL",
		"code":"EVID1000013872009",
		"lastUpdate":"2014-07-25T22:13:41.000Z",
		"location":{
			"id":"693006",
			"name":"Salle 2",
			"eventId":52671,
			"lastUpdate":"2014-07-25T22:13:39.597Z"
		},
		"fields":[{
			"name":"SHARING_IS_NOT_ALLOWED","value":"true"
		}]
	},
	/* ... */
}

6.3. Get registrations by event part

Fetch registrations to a given event part / session.

URL

/api/1/events/{eventId}/eventParts/{eventPartId}/registrations

method

GET

query params

maxResults

max number of results to fetch. Default is 100.

firstResult

index of the first result of the list to fetch. First item of the list index is 0. Default value is 0.

since

only retrieve registrations which have been updated after the given date.

queryMode

query mode:

  • SYNCHRONIZE: also returns deleted registrations (status=DELETED).

response body

{
		"nbrResults":123,
		"maxResults":0,
		"firstResult":0,
		"first":"0",
		"more":false,
		"registrations":[{
			"eventPartId":1000013872008,
			"contactId":2004254,
			"personId":1,
			"status":"EXTRA",
			"postStatus":"PRESENT",
			"category":{"id":1},
			"lastUpdate":"2014-07-09T12:41:19.000Z",
			"creationDate":"2014-07-09T12:41:19.000Z"
		},{
			"eventPartId":1000013872008,
			"contactId":100001156005,
			"personId":804105,
			"status":"CONFIRMED",
			"category":{"id":1},
			"lastUpdate":"2014-07-09T12:42:38.000Z",
			"creationDate":"2014-07-09T12:42:38.000Z"
		}]
	/* ... */
}

7. Accommodations

Accommodations are not available on the evenium.net platform

7.1. Get hotels

URL

/api/1/events/{eventId}/hotels

method

GET

query params

fields

associated hotel properties to retrieve, comma separated:

  • location: the hotel full location

  • rooms: the hotel rooms list

e.g: fields=location,rooms

response body

[{
	"id": 1134565,
	"name": "London Imperial Hotel",
	"group": "Group A",
	"stars": 4,
	"smoking": false",
	"parking": true,
	"disabledAccess": true,
	"phone": "xxxx",
	"fax": "xxxx",
	"email": "xxxx@xxx.com",
	"adminInfo": "xxxx",
	"location": {
		"street": "xxxx",
		"zipCode": "xxxx",
		"city": "London",
		"countryCode": "UK",
		"country": "United Kindom"
	},
	rooms: [{
		"id": 35378,
		"capacity": 1,
		"type": "Superior Single"
	},{
	...
	}]
},{
	...
}]

7.2. Get guest accommodations

URL

/api/1/events/{eventId}/guests/{contactId}/accommodations /api/1/events/{eventId}/guests/customId/{customId}/accommodations

method

GET

response body

[{
		roomId: 1234,
		checkinDate: '2015-11-22',
		checkoutDate: '2015-11-25',
		status: 'VALID',
},{
		...
}]

8. Authentification

You usually do not need to ask for a token using your login and password. Use API Key instead, as explained in Connecting.

8.1. Log in

URL

/api/1/loginOAuth

method

POST

contentType

application/x-www-form-urlencoded

query params

login (required)

user login.

form params

pwd (required)

user password.

response body

{
	"member":{
		"id":956041,
		"login":"SOME#LOGIN",
		...
	}
	"accessToken": "aE3s51g-6VBGKldFG2Zz5tCz0n3",
	"expiresIn": "31083558995628",
	"refreshToken": "E3s63KldFGhjz5RzEpJDUbjjKvYct"
}

response status

200

authentification succeeded.

401
{
    "code": "AUTHENTICATION_REQUIRED",
    "message": "incorrect password or login"
}
Use https to connect. Non secure http connections are not allowed.

Tokens are expired after logout.

When providing an expired / invalid access token or no token at all, API will reply with a 401 status code and the following response:

{
    "code": "AUTHENTICATION_REQUIRED",
    "message": "Authentification required - please login and provide a valid session or token parameter"
  }

8.2. Log out

URL

/api/1/logout/

method

GET

9. Client code examples

9.1. Using cURL

Useful options:

  • -X POST/PUT/DELETE: specify http method

  • -i: show HTTP headers

  • -H "Content-type: text/xml": add HTTP Header

  • -d “param1=value&param2=value”: send parameters using "Content-type: application/xwww- form-urlencoded"

  • -T file_path: send file as content

Some examples :

  1. Log in:

    curl -X POST -d "pwd=somepassword" "https://evenium.test/api/1/loginOAuth? login=SOMELOGIN"

  2. GET a resource:

    curl -H "X-Evenium-Token: xxxxxxx" "https://evenium.com/api/1/events"

  3. PUT an xml resource as a file:

    curl -i -H "X-Evenium-Token: xxxxxxx" -H 'Content-type: application/xml' -X PUT -T import_contacts.xml "http://evenium.com/api/1/contacts"

  4. PUT using parameters:

    curl -i -H "X-Evenium-Token: xxxxxxx" -X PUT -d "status=CANCELED" "http://evenium.com/api/1/events/123/guests/456/status"

10. Data Format

10.1. Compressing data

The API supports data compression using standard GZIP scheme. If you can support it, please consider using it as it could reduce the size of data exchanged by a 15 factor.

10.1.1. Sending compressed data:

Add the following to the request header:

Content-Encoding: gzip

10.1.2. Receiving compressed data:

If you are willing / able to receive compressed data, add the following to your request header:

Accept-Encoding: gzip, deflate

The server indicates data it is sending is compressed by adding the following to the response

header:
Content-Encoding: gzip

10.2. Dates, timestamps

Dates format follows RFC 3339, for query params as well as message entities properties.

e.g.:
https://127.0.0.1/api/1/contacts?...&since= 2010-01-01T12:00:00+01:00

https://127.0.0.1/api/1/contacts?...& since=2010-01-01Z&until=2011-01-01Z

https://127.0.0.1/api/1/events?...& since=2010-05-10-00:05&until=2010-05-15-05:00

...<lastUpdate>2010-02-05T13:37:35.000Z</lastUpdate>...

Let’s consider the following date :

Feb 14 2010 at 00:00:00 (CET / in France for instance)

Here are valid representations of this date (Z stands for UTC):

2010-02-14+01:00
2010-02-14T00:00:00+01:00
2010-02-14T00:00:00.000+01:00
2010-02-13T23:00:00Z
2010-02-13T23:00:00.000Z

These ones are also valid but ambiguous and should be avoided as they refer to the default timezone of our servers (which happens to be Central European Time (CET) ):

2010-02-14
2010-02-14T00:00:00
2010-02-14T00:00:00.000

Date properties returned by the api are always normalized to UTC:

<lastUpdate>2010-02-05T13:37:35.000Z</lastUpdate>
Time offsets

We strongly recommend working with UTC dates, rather than trying to manually add a time offset, as in a given timezone, the time offset depends on the date itself (due to daylight savings for example).

For example, in New York:

Local time RFC 3339

Mon May 24 16:00:00

2010-05-24T10:00:00-04:00

Wed Nov 24 16:00:00

2010-11-24T10:00:00-05:00

10.3. Internationalization

Some data or messages may be internationalized.

See RFC 3282 for the complete internet standard.

In a nutshell, to get internationalized content, you need to add a header to your request:

Accept-Language: fr,en

This header specifies the list of preferred languages tags (from most preferred to least preferred).

In most cases, a language tag is made of language code with an optional country code to specify a national variant:

Accept-Language: en_US

The language argument is a valid ISO Language Code. These codes are the lower-case, two-letter codes as defined by ISO-639. You can find a full list of these codes at a number of sites, such as:

http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt

The country argument is a valid ISO Country Code. These codes are the upper-case, two-letter codes as defined by ISO-3166. You can find a full list of these codes at a number of sites, such as:

http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html

11. Constants

11.1. Event status

Value Backoffice name Comments

FUTURE

Open

DRAFT

Draft

DELETED

Deleted

Event is not visible in backoffice any more

CLOSED

Closed

ARCHIVED

Archived

CANCELED

Canceled

CLONEABLE

Template

An event template, not a real event. Not visible in backoffice.

11.2. Guest status

Canceled status:

  • DELETED

  • CANCELED

  • REPLACED

  • DECLINED

Pending status:

  • PENDING

  • UNANSWERED

Confirmed status:

  • VALID

  • RESERVED

  • OVERBOOKED

  • EXTRA

  • CONFIRMED

11.3. Guest post status

  • UNKNOWN

  • NO_SHOW

  • PRESENT

11.4. Optional modules

Value Description

EVENT_CONNEXME

ConnexMe / interactive meetings

EVENT_GUEST_EXPENSES

Expense tracking and financial reporting

EVENT_ONSITE

Onsite / check-in

EVENT_HIERARCHY

Collaborative management

11.5. Guest fields

11.5.1. Transport request fields:

Name Description

TRANSPORT_WORKFLOW_STATUS

Transport request status

TRANSPORT_WORKFLOW_INFOS_WAYBACK_TYPE

Transport request type

TRANSPORT_WORKFLOW_INFOS_WAYTO_CITY

Way to departure place

TRANSPORT_WORKFLOW_INFOS_WAYTO_DATE

Way to departure date

TRANSPORT_WORKFLOW_INFOS_WAYTO_HOUR

Way to departure hour

TRANSPORT_WORKFLOW_INFOS_WAYBACK_CITY

Way back arrival place

TRANSPORT_WORKFLOW_INFOS_WAYBACK_DATE

Way back arrival date

TRANSPORT_WORKFLOW_INFOS_WAYBACK_HOUR

Way back arrival hour

12. Errors

TODO: error codes