Oracle Eloqua AppCloud Developer Framework

Download as pdf or txt
Download as pdf or txt
You are on page 1of 85
At a glance
Powered by AI
The document describes the Oracle Eloqua AppCloud framework and how to develop, register, and publish apps on the platform.

The document describes action, decision, content, feeder, menu, and firehose services.

The document outlines three steps to register an app - providing details, registering individual services, and viewing the app.

http://docs.oracle.

com

Oracle Eloqua AppCloud Developer


Framework
Developer Guide

2015 Oracle Corporation. All rights reserved

31/03/2015

Contents
1 Oracle Eloqua AppCloud Developer's Guide

1.1 Features

1.2 Flow

1.3 First Steps with the OracleEloqua AppCloud

1.3.1 Requirements

1.3.2 Create a Provider

1.3.3 NextSteps
1.4 Service Descriptions

10
10

1.4.1 OracleEloqua AppCloud Actions

10

1.4.2 OracleEloqua AppCloud Decisions

11

1.4.3 OracleEloqua AppCloud Feeders

11

1.4.4 OracleEloqua AppCloud Content

11

1.4.5 OracleEloqua AppCloud Menus

11

1.4.6 OracleEloqua AppCloud Firehose

11

1.5 Introduction to URL Templating

12

1.5.1 Example

12

1.5.2 Recommendations

12

2 Develop an App
2.1 Instantiation-Execution Model

13
13

2.1.1 Service Instantiation

13

2.1.2 Execution

15

2.2 Develop an OracleEloqua AppCloud Action Service

16

2.2.1 CreateURL call and response

18

2.2.2 Cloud API call from AwesomeApp

18

2.2.3 Notification URL Call and Response

19

2.3 Develop an OracleEloqua AppCloud Decision Service

22

2.3.1 CreateURL call and response

24

2.3.2 Cloud API call from AwesomeApp

24

2.3.3 Notification URL Call and Response

25

2.4 Develop an OracleEloqua AppCloud Content Service

2015 Oracle Corporation. All rights reserved

28

2 of 85

2.4.1 Content Service Flow Diagrams

30

2.4.2 CreateURL call and response

31

2.4.3 Cloud API call from AwesomeApp

32

2.4.4 Notification URL Call and Response

33

2.5 Develop an OracleEloqua AppCloudFeeder Service

36

2.5.1 CreateURL call and response

39

2.5.2 Notification URL Call and Response

39

2.6 Develop an OracleEloqua AppCloud Menu Service

42

2.7 Develop an OracleEloqua AppCloud Firehose Service

43

3 Register Your App


3.1 Step 1: Register the App

45
45

3.1.1 Details

45

3.1.2 Lifecycle

46

3.1.3 OAuth

46

3.2 Step 2: Register Services

47

3.3 Step 3: View the App

48

3.4 Register an Action Service

49

3.4.1 Service Details

50

3.4.2 Instance Configuration

50

3.4.3 Action Settings

51

3.5 Register a Decision Service

52

3.5.1 Service Details

52

3.5.2 Instance Configuration

53

3.5.3 Content-Type of Notification POST Call

54

3.5.4 Decision Settings

54

3.6 Register a Content Service

55

3.6.1 Service Details

55

3.6.2 Instance Configuration

55

3.6.3 Content Settings

57

3.7 Register a Feeder Service

58

3.7.1 Service Details

58

3.7.2 Instance Configuration

59

2015 Oracle Corporation. All rights reserved

3 of 85

3.7.3 Feeder Settings


3.8 Register a Menu Service

60
60

3.8.1 Menu Settings

61

3.8.2 Service Details

62

3.9 Register a Firehose Service

62

3.9.1 Service Details

62

3.9.2 Firehose Settings

63

4 Publish Your App


4.1 Grant Access

64
64

4.1.1 Publish To A Specific Site

64

4.1.2 Publish to All Sites

65

4.2 Share the URL

65

4.3 Next Steps

65

4.4 AppCloud Installation Flow

65

4.4.1 No AdditionalInformationNeeded

66

4.4.2 Additional Information Needed

66

4.5 Respond When Eloqua Calls the Status URL


4.5.1 Example
4.6 Respond When a Marketer Copies a Service Instance

67
67
68

4.6.1 Sample Copy URL Call and Response

68

4.6.2 Persistent Settings and Data

69

4.7 Scheduled Maintenance

69

4.8 App Shutdown

70

4.8.1 Shutdown

71

4.8.2 Reactivate YourApp

71

4.9 Update or Check your App's Status Using theCloudAPI

71

4.9.1 To Check the App's Status

71

4.9.2 To Update the App's Status

72

5 Frequently Asked Questions


5.1 General
5.1.1 Why shouldI develop apps for the OracleEloqua AppCloud?

74
74
74

5.1.2 What permissions do Ineed to start developing apps for the OracleEloqua AppCloud? 74

2015 Oracle Corporation. All rights reserved

4 of 85

5.1.3 When and how doesmy app get listed on the OracleEloqua AppCloud site?

74

5.1.4 How do marketers find my app to start using it?

74

5.1.5 Is there an OracleEloqua AppCloud certification program?

74

5.2 OracleEloqua AppCloud Services and Operations

75

5.2.1 Whichservice shouldI develop?

75

5.2.2 What's the difference between OracleEloqua AppCloud services and


CloudConnectors orComponents?

75

5.2.3 Can Iinclude Campaign, Email, Landing Page, Form (etc) fields in my record
definition?

75

5.2.4 Can Iinclude static values in my record definition?

75

5.3 Managing Your Apps

75

5.3.1 What happens if contacts are errored in an Action or Decision step?What happens if
the service is unavailable when contacts flow into a step on the canvas?
75
5.3.2 Does Eloqua notify me when someone uninstalls or deletes my app from their Eloqua
instance?
76
5.3.3 How do I delete an app that I have developed?

76

5.3.4 Why is my app shut down?

76

5.3.5 Will Eloqua retry my contacts if my app doesn't respond?

76

5.4 Limits

76

5.4.1 Are there limits that I should be aware of?

76

5.4.2 What happens if Ireach the daily sync limits?

77

6 Reference
6.1 URL Parameters

78
78

6.1.1 GeneralParameters

78

6.1.2 App-Specific Parameters

79

6.1.3 Content-Specific Parameters

80

6.2 PUT /actions/instances/{id}

80

6.2.1 URL parameters

80

6.2.2 Request Body

80

6.2.3 Example

81

6.3 PUT /contents/instances/{id}

81

6.3.1 URL parameters

81

6.3.2 Request Body

81

2015 Oracle Corporation. All rights reserved

5 of 85

6.3.3 Example
6.4 PUT /decisions/instances/{id}

82
82

6.4.1 URL parameters

82

6.4.2 Request Body

82

6.4.3 Example

82

6.5 GET /apps/{id}/configurations

83

6.5.1 URL parameters

83

6.5.2 Request Body

83

6.5.3 Example

83

6.6 PUT /apps/{id}/configurations

84

6.6.1 URL parameters

84

6.6.2 Request Body

84

6.6.3 Example

84

2015 Oracle Corporation. All rights reserved

6 of 85

1 Oracle Eloqua AppCloud Developer's Guide


The OracleEloqua AppCloud Developer Framework is a complete development platform where you
can easily build, register, and deploy apps for Eloqua. With new and improved service types which
take advantage of Eloqua's Bulk API, support for OAuth, and the ability to test your applications with
Eloqua prior to launch, the OracleEloqua AppCloud Developer Framework provides the environment
needed to put apps first.
The framework allows third parties to register and manage the integrations that they build for Eloqua
right from their own Eloqua development instance. It also offers common, repeatable patterns for
building Apps that extend the functionality of Eloqua, providing a consistent, seamless experience for
the marketing user.

1.1 Features
App Keys and OAuth2
Testing: test your apps inside your development instance before going live
Selective whitelististing, so you can run betas on your Apps before release
Improved processing speeds with the Bulk API
A seamless flow for App installation and configuration
6 OracleEloqua AppCloud service types to support your different goals. Read about the service
types for more information.

1.2 Flow
Getting started with the OracleEloqua AppCloud Developer Framwork follow a three step flow: first,
you need to register as a provider in your Eloqua development instance. This gives you provider
credentials that you can use to develop apps that interact with Eloqua. Then, you need to develop an
app, and register it with Eloqua. When you register an app, you provide Eloqua with a series of

templated URLs that Eloqua uses to call out to your app. The register services guides provide
guidance on what URL parameters you should include in each templated URL so that you will receive
the data you need to do whatever your app does. Finally, you can publish the app, either to specific
Eloqua instances, or as a general release. Once you whitelist a site, you can share your app's install
URL so that the site's administrator can install the app and let marketers start using it.

2015 Oracle Corporation. All rights reserved

7 of 85

1.3 First Steps with the OracleEloqua AppCloud


TheOracleEloqua AppCloud Developer Framework is designed to make it easy to start working with
the framework with minimal setup effort required. Once you have registered as a provider and ensured
that your Eloqua user has sufficient permissions, you are ready to start developing an app!

1.3.1 Requirements
A development Eloqua instance in which you have registered as a provider
Sufficient user permissions:the user making calls against Eloqua's APIs must have APIUsers
and AdvancedUsers - Marketing permissions granted in the Security Groups section of
theuser management area of Eloqua.

1.3.2 Create a Provider


Register As A Provider
To register as a Provider, log in to your Eloqua instance, and navigate to the Setup menu, then choose
AppCloud Developer.

2015 Oracle Corporation. All rights reserved

8 of 85

Then, click Create a Provider, which brings you to the AppCloud Developer Create New Provider
page.

Fill out your companys information:


Icon URL: theURLof your Provider logo.This will be displayed alongside your Provider
information You might want to use your company logo. This is optional.
Name: your Provider name. You might want to use your company name.
Website URL: your company website. This is optional.
Support email address: the email address users should use to contact you if there are issues
with your app.
Support phone number: a phone number where you can be contacted if there are problems
with your app.
Click Save, and youre all set up as a provider.

Edit Provider Information


You can easily edit this information by selecting the Provider tab within the AppCloud Developer
section of Eloqua, and clicking Edit.

2015 Oracle Corporation. All rights reserved

9 of 85

The Prover Details page includes the unique GUID-based provider External Id.

1.3.3 NextSteps
Once you've registered as a provider, read the See "Service Descriptions" on page 10 to determine
which ones you want to implement in your app, read about URLtemplating, and then consider the See
"Develop an App" on page 13.

1.4 Service Descriptions


1.4.1 OracleEloqua AppCloud Actions
Actions allow a marketer to add an action step to a campaign that is performed by an external system.
For example, an action service could send contacts SMS messages, trigger a direct mailing, or register
a contacts for a webinar. When contacts enter an action step, Eloqua calls out to the app, and the app
responds by performing an action in an external system.The app then informs Eloqua that the process
is complete and the contact moves on in the workflow. Read more about Actions in the development
guide and service registration instructions.

2015 Oracle Corporation. All rights reserved

10 of 85

1.4.2 OracleEloqua AppCloud Decisions


Decisions allow a marketer to delegate a decision-making step in a campaign to an external system
without having to bring the system's data into Eloqua. Decision services evaluate contacts using
externally-held data, and determine whether the contacts meet the criteria. The service responds with
'yes' or 'no' to determine which path the contact should take through the campaign workflow. For
example, a decision service could check if a contact exists in a CRMsystem, and sort the contacts
accordingly. With AppCloud Decisions, the data used in the decision never needs to be brought into
Eloqua. Read more about Decisions in the development guide and service registration instructions.

1.4.3 OracleEloqua AppCloud Feeders


With Feeders, developers can build apps that use data in third-party services to drive campaign
membership.Feeders allow marketers to populate a campaign with contacts from an external system,
automatically importing the contacts into Eloqua and adding them to the campaign. Read more about
Feeders in the development guide and service registration instructions

1.4.4 OracleEloqua AppCloud Content


Content allows marketers to source pieces of content in Eloqua emails and Landing Pages from an
external source. This is the new and improved version of Eloquas Cloud Components framework, and
it includes many improvements such as asynchronous bulk processing (for emails), the ability to fully
test the content service within Eloqua, and design-time interaction with the Email and Landing Page
editors.Read more about Content in the development guide and service registration instructions

1.4.5 OracleEloqua AppCloud Menus


The AppCloud Menus service is all about context. AppCloud Menus enable a marketer to launch an
externally-hosted application from within Eloqua via a menu dock. This menu dock floats on the right
side of the screen in the Campaign Canvas or asset editor screens. Read more about Menus in the
development guide and service registration instructions

1.4.6 OracleEloqua AppCloud Firehose


The Firehose service, acts as a web hook, and notifies an external system when a marketer performs
an action in Eloqua. For example, when a marketer creates a campaign or edits an email, Eloqua can

2015 Oracle Corporation. All rights reserved

11 of 85

call out to the third-party with the update. Read more about the Firehose service in the development
guide and service registration instructions

1.5 Introduction to URL Templating


The OracleEloqua AppCloudDeveloper Framework supports URL Templating to enable you to
configure the service URIs that Eloqua calls out to. Any acceptable template parameter is substituted
with the appropriate value before the call is made.
Common URL parameters include {UserId}, the unique identifier for the user whose actions
triggered the call, {InstanceId}, the GUID-based ID that identifies an instance of a service, and

{EventType}, which provides campaign status information (Created, Activated, Draft, and so on).
These URL parameters enable you to configure the service URLs that Eloqua calls out to, specifying
the information that you need for your application.

1.5.1 Example
Consider this templatedURL:

https://awesomeapp.example.com/create/instance={InstanceId}
&asset={AssetId}&site={SiteName}
WhenEloqua calls theURL, the templated parameters are replaced with the appropriate values:

https://awesomeapp.example.com/create/instance=b5fc25ce-970942c4-a57d-caa00e23f658&asset=45&site=DocsExampleSite

1.5.2 Recommendations
Choose the URLparameters to include in your templatedURLs based on your use case. These
parameters provide contextual information:your application design will determine which parameters
you need. The full list of parameters is available. The url parameters reference provides a description
for each parameter. You should familiarize yourself with the supportedURLparameters when
designing your templatedURLs.
The service registration guides also include suggestions for parameters to include for specific URLs.
These recommendations are the minimum you will likely need. Include additional parameters if you
require them.

2015 Oracle Corporation. All rights reserved

12 of 85

2 Develop an App
The OracleEloqua AppCloud Development Framework provides 6 service types that you can develop
to extend Eloqua's functionality. Some services create steps that a marketer can add to the campaign
canvas, or to an email or landing page, another service type enables marketers to launch third-party
applications directly from within Eloqua's UI, while another yet creates a web hook that calls out to a
third-party service when a marketer performs an action within Eloqua.
These services make it easy for developers to extend Eloqua's capabilities, providing new
opportunities for marketers to harness both Eloqua data and external services to better serve their
goals.
Before you start developing OracleEloqua AppCloud services, familiarize yourself with the
instantiation-execution model, which Actions,Decisions, Feeders, and Content follow. Then, you can
read the development guides:
Develop an Action Service
Develop a Decision Service
Develop a Feeder Service
Develop a Content Service
Develop a Firehose Service
Develop a Menu Service

2.1 Instantiation-Execution Model


With the exception of Menus and the Firehose, OracleEloqua AppCloud Services follow an
instantiation-execution model. When you add an Decision or Action step to a campaign in the
Campaign Canvas, a new instance of that Decision or Action service is created. When that campaign
reaches the Decision or Action stage, the service is executed. Similarly, when Content is added to an
email or landing page, a new instance of that Content service is created.

2.1.1 Service Instantiation


1. A Marketer drags the service onto the Campaign Canvas or onto an email or landing page in the
asset editor. This triggers a call from the Eloqua UI to an internal Eloqua API that will interact
with your servers.
2. The internal Eloqua API calls out to your service using the templated Create URL you
configured when registering your App. This is a POST request, authenticated with OAuth, which
contains an empty JSON object. The call provides you with the new instances GUID.

2015 Oracle Corporation. All rights reserved

13 of 85

For example, AwesomeApp has an AppCloud Decision service whose Create URL is:

https://example.com/awesomeapp/decide/create?instance=
{instanceId}
Eloqua calls out to this URL with an empty JSON object, replacing the templated parameters
with the service instance ID and app installation ID.
Your application should respond with default details in a Record Definition Data Transfer Object
(DTO). For example, for a Decision service, the response might resemble:

{
"recordDefinition":
{
"ContactID" : "{{Contact.Id}}",
"EmailAddress" : "{{Contact.Field(C_EmailAddress)}}
"
}
}
This tells Eloqua to send the contacts Contact ID and email address when the service is
executed. For detailed instructions, see the documentation specific to each service type.
3. The Marketer can then configure the instance using your services UI by clicking on the Edit
button on the service instance. Eloqua opens a browser window to the Configure URL for the
service. Note: this call to the Configure URL comes directly from the marketing users browser,
rather than from the Eloqua API. If you need to restrict access, you can do so here by requiring
the user be on a specific VPN, for example.
4. If the Marketer has made changes, your API should call back to Eloqua using a PUT request
with an updated DTO specifying the new record definition. For example, if the Marketer created
an AppCloud Decision step that required field1, field2, and field3, the PUT request
would resemble:

PUT
https://secure.eloqua.com/api/cloud/1.0/decisions/instance/f
ddc932a-f27d-40c3-a126-82299b9512c5
{
"recordDefinition":
{
"ContactID" : "{{Contact.Id}}",
"EmailAddress" : "{{Contact.Field(C_EmailAddress)}}",
"field1" : "{{Contact.Field(C_field1)}}",

2015 Oracle Corporation. All rights reserved

14 of 85

"field2" : "{{Contact.Field(C_field2)}}",
"field3" : "{{Contact.Field(C_field3)}}"
}
}

2.1.2 Execution
1. When the service is activated, either by contacts flowing through a campaign or a visit to a
landing page, this batch of contacts is tagged with an execution ID that tracks its progress.
2. This step varies depending on the service type, but in general, the Eloqua internal API calls out
to the Services notification URL, and transmits a the information you specified during the
configuration phase. In the above example, then, the recordDefinition includes the
contacts ID, email address, field1, field2 and field3. The call to the notification URL would then
resemble:

POST
https://example.com/awesomeapp/decide/notify?instance=fddc93
2a-f27d-40c3-a126-82299b9512c5&asset=456
{
"offset" : 0,
"limit" : 1000,
"totalResults" : 2,
"count" : 2,
"hasMore" : false,
"items" :
[
{
"ContactID" : "1",
"EmailAddress" : "[email protected]",
"field1" : "stuff",
"field2" : "things",
"field3" : "et cetera"
},
{
"ContactID" : "2",
"EmailAddress" : "[email protected]",

2015 Oracle Corporation. All rights reserved

15 of 85

"field1" : "more stuff",


"field2" : "other things",
"field3" : "and so on"
}
]
}
This follows the format defined during the create URL and configure URL calls during the
Instantiation phase.
3. If your service is unavailable, Eloqua will retry five times. If you specified Maximum Record
size of 0 when you configured your App, or the record definition sent during the instantiation
phase contains no fields, the DTO contains an empty JSON object. Otherwise, the call sends a
DTO containing contact data, with a maximum limit to the number of records as specified in the
service configuration. If there are more records than the maximum limit, Eloqua will keep
sending requests until all the data is transmitted.
4. You can then choose to return the same response for all the contacts in the batch, or tailor your
responses to each contact.
To individualize your responses for each contact, the desired HTTP response status code is a
204, followed up with an Import call using Eloquas Bulk API. You must specify sync actions
during the import. The appropriate sync actions vary according to the service type. Refer to the
Bulk API documentation and the service-specific documentation for more information
5. Eloqua receives the import. For service instances associated with a campaign, those contacts
flow through to the next stage.

2.2 Develop an OracleEloqua AppCloud Action Service


Actions are steps on the Campaign Canvas that are delegated to an external system. This allows you
to perform actions that you cannot do with Eloqua. Actions are analogous to the existing Cloud
Connectors.
Actions follow the instantiation-execution model. The following sections describe Action-specific
details and provide the endpoints needed to develop an Action service. If you are not familiar with the
general flow for the instantiation-execution model, you should read that first.
Eloqua signs all outgoing calls with OAuth 1.0a so the receiving system can validate that the call was
sent by Eloqua. Refer to the OAuth 1.0a spec or OAuth 1.0 RFC for more information.

2015 Oracle Corporation. All rights reserved

16 of 85

2015 Oracle Corporation. All rights reserved

17 of 85

2.2.1 CreateURL call and response


Eloquas call to the CreateURL:

POST
https://example.com/awesomeapp/act/create?instance=f82d50cd86a9-4fca-b37e-4ec9a98b0339
{}
AwesomeApps response is a DTO describing the fields Eloqua should transmit when the service in
executed. You can include a maximum of 100 fields in your record definition. See: Bulk API Limits for
more information.

{
"recordDefinition" :
{
"ContactID" : "{{Contact.Id}}",
"EmailAddress" : "{{Contact.Field(C_EmailAddress)}}"
}
}

2.2.2 Cloud API call from AwesomeApp


When a user clicks the edit button on the service instance and makes changes through the Configure
URL that require an updated recordDefinition DTO, AwesomeApp must call out to Eloquas Cloud API

PUT /actions/instances/{id} endpoint with that updated DTO:


PUT
https://secure.eloqua.com/api/cloud/1.0/actions/instances/f82d50
cd-86a9-4fca-b37e-4ec9a98b0339
{
"recordDefinition":
{
"ContactID" : "{{Contact.Id}}",
"EmailAddress" : "{{Contact.Field(C_EmailAddress)}}",
"field1" : "{{Contact.Field(C_field1)}}",
"field2" : "{{Contact.Field(C_field2)}}",
"field3" : "{{Contact.Field(C_field3)}}"
}
}

2015 Oracle Corporation. All rights reserved

18 of 85

2.2.3 Notification URL Call and Response


Eloquas call to the Notification URL transmits the requested fields in the items parameter:

POST
https://example.com/awesomeapp/act/notify?instance=f82d50cd86a9-4fca-b37e-4ec9a98b0339&asset=456
{
"offset" : 0,
"limit" : 1000,
"totalResults" : 2,
"count" : 2,
"hasMore" : false,
"items" :
[
{
"ContactID" : "1",
"EmailAddress" : "[email protected]",
"field1" : "stuff",
"field2" : "things",
"field3" : "et cetera"
},
{
"ContactID" : "2",
"EmailAddress" : "[email protected]",
"field1" : "more stuff",
"field2" : "other things",
"field3" : "and so on"
}
]
}
New in version Fall-2014:If AwesomeApp configured its Action service to automatically set the
contacts' status to "complete" when Eloqua calls out to the notification URL, it simply accepts the
notification URL and performs it action. No calls in to Eloqua's Bulk API are needed. Eloqua will ignore
the response to the notification URL call, provided it is not a 400- or 500-level error.
Otherwise AwesomeApp responds with a 204 response, indicating that the response will be
asynchronous, followed by an import to Eloquas Bulk API, where AwesomeApp specifies a sync
action. For Actions, the sync action is either complete or errored. Note that the maximum import
size per batch is 50,000: if you have more than 50,000 contacts, break your data up into multiple
imports.

2015 Oracle Corporation. All rights reserved

19 of 85

Bulk API Import


1. Create the bulk import definition, setting the status to yes. The "destination" field refers to the
Action service's instance - in this example, the instance GUID is f82d50cd-86a9-4fca-

b37e-4ec9a98b0339:
When referencing service instances, you must transmit theGUID without dashes. The
Bulk APIwill error if you transmit the GUID with the dashes.

POST https://secure.eloqua.com/api/bulk/2.0/contacts/imports
?
{
"name" : "AwesomeApp Action Response Bulk Import",
"updateRule" : "always",
"fields" : {
"emailAddress" : "{{Contact.Field(C_EmailAddress)}}"
},
"syncActions" : [
{
"destination" : "{{ActionInstance
(f82d50cd86a94fcab37e4ec9a98b0339)}}",
"action" : "setStatus",
"status" : "complete"
}
],
"identifierFieldName" : "emailAddress"
}
Eloquas response will be a 201 Created response that includes a uri parameter, which you
can use to identify the import:

HTTP/1.1 201 Created


{
"name" : "AwesomeApp Action Response Bulk Import",
"updateRule" : "always",
"fields" : {
"emailAddress" : "{{Contact.Field(C_EmailAddress)}}"
},
"identifierFieldName" : "emailAddress",

2015 Oracle Corporation. All rights reserved

20 of 85

"syncActions" : [
{
"destination" : "{{ActionInstance
(f82d50cd86a94fcab37e4ec9a98b0339)}}",
"action" : "setStatus",
"status" : "complete"
}
],
"isSyncTriggeredOnImport" : false,
"isUpdatingMultipleMatchedRecords" : false,
"uri" : "/contacts/imports/6",
"createdBy" : "DocsExample",
"createdAt" : "2014-03-06T13:59:00.6600046Z",
"updatedBy" : "DocsExample",
"updatedAt" : "2014-03-06T13:59:00.6600046Z"
}
2.

Send Eloqua the data for import as a using the uri:

POST
https://secure.eloqua.com/api/bulk/2.0/contacts/imports
/6/data
[
{
"emailAddress" : "[email protected]"
},
{
"emailAddress" : "[email protected]"
}
]
3. Synchronize the data for import:
AwesomeApps request:

POST https://secure.eloqua.com/api/bulk/2.0/syncs
{
"syncedInstanceURI":"/contacts/imports/6",
}
Eloquas Response:

201 Created

2015 Oracle Corporation. All rights reserved

21 of 85

{
"syncedInstanceURI" : "/contacts/imports/6",
"status" : "pending",
"createdAt" : "2014-01-01T13:59:07.1375620Z",
"createdBy" : "DocsExample",
"uri" : "/syncs/6"
}
4. You can then use the syncs uri (/syncs/6) to check the status of the sync:

GET https://secure.eloqua.com/api/bulk/2.0/sync/6
For a full description of the sync status codes, see: Bulk API Sync Status Codes
When the sync is complete, Eloquas response will resemble:

200 OK
{
"syncedInstanceURI" : "/contacts/imports/6",
"syncStartedAt" : "2014-01-01T13:59:07.1375620Z",
"syncEndedAt" : "2014-01-01T13:59:14.1375620Z",
"status" : "success",
"createdAt" : "2014-01-01T13:59:07.1375620Z",
"createdBy" : "DocsExample",
"uri" : "/syncs/6"
}
If you run into trouble or have questions about theBulk API, check out theBulk APIdocumentation.

2.3 Develop an OracleEloqua AppCloud Decision Service


Decisions are steps in the Campaign Canvas that directly control the path a contact takes as they flow
through a campaign. Decision steps delegate the decision making to an external system, which
responds with a "yes" or "no" for each contact, determining which path the contacts should take.
Decisions follow the instantiation-execution model. The following sections describe Decision-specific
details and provide the endpoints needed to develop a Decision service. If you are not familiar with the
general flow for the instantiation-execution model, you should read that first.
Eloqua signs all outgoing calls with OAuth 1.0a so the receiving system can validate that the call was
sent by Eloqua. Refer to the OAuth 1.0a spec or OAuth 1.0 RFC for more information.

2015 Oracle Corporation. All rights reserved

22 of 85

2015 Oracle Corporation. All rights reserved

23 of 85

2.3.1 CreateURL call and response


Eloquas call to the CreateURL:

POST
https://example.com/awesomeapp/decide/create?instance=9347bfe19c72-409c-a5cd-402ff74f0caa
{}
AwesomeApps response is a DTO describing the fields Eloqua should transmit when the service in
executed. You can include a maximum of 100 fields in your record definition. See: Bulk API Limits for
more information.

{
"recordDefinition" :
{
"ContactID" : "{{Contact.Id}}",
"EmailAddress" : "{{Contact.Field(C_EmailAddress)}}"
}
}

2.3.2 Cloud API call from AwesomeApp


When a user clicks the edit button on the service instance and makes changes through the Configure
URL that require an updated recordDefinition DTO, AwesomeApp must call out to Eloquas Cloud API

PUT /decisions/instances/{id} endpoint with that updated DTO:


PUT
https://secure.eloqua.com/api/cloud/1.0/decisions/instances/9347
bfe1-9c72-409c-a5cd-402ff74f0caa
{
"recordDefinition":
{
"ContactID" : "{{Contact.Id}}",
"EmailAddress" : "{{Contact.Field(C_EmailAddress)}}",
"field1" : "{{Contact.Field(C_field1)}}",
"field2" : "{{Contact.Field(C_field2)}}",
"field3" : "{{Contact.Field(C_field3)}}"
}
}

2015 Oracle Corporation. All rights reserved

24 of 85

2.3.3 Notification URL Call and Response


Eloquas call to the Notification URL transmits the requested fields in the items parameter:

POST
https://example.com/awesomeapp/decide/notify?instance=9347bfe19c72-409c-a5cd-402ff74f0caa&asset=456
{
"offset" : 0,
"limit" : 1000,
"totalResults" : 2,
"count" : 2,
"hasMore" : false,
"items" :
[
{
"ContactID" : "1",
"EmailAddress" : "[email protected]",
"field1" : "stuff",
"field2" : "things",
"field3" : "et cetera"
},
{
"ContactID" : "2",
"EmailAddress" : "[email protected]",
"field1" : "more stuff",
"field2" : "other things",
"field3" : "and so on"
}
]
}
AwesomeApp responds with a 204 response, indicating that the response will be asynchronous,
followed by an import to Eloqua's Bulk API, where AwesomeApp specifies a sync action. For
Decisions, the sync action is either "yes", "no", or "errored". AwesomeApp will need to create
multiple imports for the different statuses, with contacts that should follow the "no" path in one import
and contacts that should follow the "yes" path in another. Note that the maximum import size per batch
is 50,000: if you have more than 50,000 contacts, break your data up into multiple imports.

Bulk API Import


1. Create the bulk import definition, setting the status to yes. The "destination" field refers to the
AppCloud Decision service's instance - in this example, the instance ID is 9347bfe1-

9c72-409c-a5cd-402ff74f0caa:

2015 Oracle Corporation. All rights reserved

25 of 85

When referencing service instances, you must transmit theGUID without dashes. The
Bulk APIwill error if you transmit the GUID with the dashes.

POST https://secure.eloqua.com/api/bulk/2.0/contacts/imports
?
{
"name" : "AwesomeApp Decision Response Bulk Import",
"updateRule" : "always",
"fields" : {
"emailAddress" : "{{Contact.Field(C_EmailAddress)}}"
}
"syncActions" : [
{
"destination" : "{{DecisionInstance
(9347bfe19c72409ca5cd402ff74f0caa)}}",
"action" : "setStatus",
"status" : "yes"
}
],
"identifierFieldName" : "emailAddress"
}
Eloquas response will be a 201 Created response that includes a uri parameter, which you
can use to identify the import:

HTTP/1.1 201 Created

{
"name" : "AwesomeApp Decision Response Bulk Import",
"updateRule" : "always",
"fields" : {
"emailAddress" : "{{Contact.Field(C_EmailAddress)}}"
},
"identifierFieldName" : "emailAddress",
"syncActions" : [
{
"destination" : "{{DecisionInstance

2015 Oracle Corporation. All rights reserved

26 of 85

(9347bfe19c72409ca5cd402ff74f0caa)}}",
"action" : "setStatus",
"status" : "yes"
}
],
"isSyncTriggeredOnImport" : false,
"isUpdatingMultipleMatchedRecords" : false,
"uri" : "/contacts/imports/6",
"createdBy" : "DocsExample",
"createdAt" : "2014-03-06T13:59:00.6600046Z",
"updatedBy" : "DocsExample",
"updatedAt" : "2014-03-06T13:59:00.6600046Z"
}
2.

Send Eloqua the data for import as a using the uri:

POST
https://secure.eloqua.com/api/bulk/2.0/contacts/imports
/6/data
[
{
"emailAddress" : "[email protected]"
},
{
"emailAddress" : "[email protected]"
}
]
3. Synchronize the data for import:
AwesomeApps request:

POST https://secure.eloqua.com/api/bulk/2.0/syncs
{
"syncedInstanceURI":"/contacts/imports/6",
}
Eloquas Response:

201 Created
{

2015 Oracle Corporation. All rights reserved

27 of 85

"syncedInstanceURI" : "/contacts/imports/6",
"status" : "pending",
"createdAt" : "2014-01-01T13:59:07.1375620Z",
"createdBy" : "DocsExample",
"uri" : "/syncs/6"
}
4. You can then use the syncs uri (/syncs/6) to check the status of the sync:

GET https://secure.eloqua.com/api/bulk/2.0/sync/6
For a full description of the sync status codes, see: Bulk API Sync Status Codes
When the sync is complete, Eloquas response will resemble:

200 OK
{
"syncedInstanceURI" : "/contacts/imports/6",
"syncStartedAt" : "2014-01-01T13:59:07.1375620Z",
"syncEndedAt" : "2014-01-01T13:59:14.1375620Z",
"status" : "success",
"createdAt" : "2014-01-01T13:59:07.1375620Z",
"createdBy" : "DocsExample",
"uri" : "/syncs/6"
}
If you run into trouble or have questions about theBulk API, check out theBulk APIdocumentation.

2.4 Develop an OracleEloqua AppCloud Content Service


Content allows marketers to source pieces of content in Eloqua emails and Landing Pages, from an
external source. This is the new and improved version of Eloqua's Cloud Components framework, and
it includes many improvements such as asynchronous bulk processing (for emails), the ability to fully
test the content service within Eloqua, and design-time interaction with the Email and Landing Page
editors.
Content follows the instantiation-execution model.The following sections describe Content-specific
details and provide the endpoints needed to develop a Content service. If you are not familiar with the
general flow for the instantiation-execution model, you should read that first.

2015 Oracle Corporation. All rights reserved

28 of 85

Eloqua signs all outgoing calls with OAuth 1.0a so the receiving system can validate that the call was
sent by Eloqua. Refer to the OAuth 1.0a spec or OAuth 1.0 RFC for more information.

2015 Oracle Corporation. All rights reserved

29 of 85

2.4.1 Content Service Flow Diagrams


For Emails

For Landing Pages

2015 Oracle Corporation. All rights reserved

30 of 85

2.4.2 CreateURL call and response


Eloquas call to the CreateURL:

POST

2015 Oracle Corporation. All rights reserved

31 of 85

https://example.com/awesomeapp/content/create?instance=f82d50cd86a9-4fca-b37e-4ec9a98b0339
{}
For a Content service, AwesomeApp's response must include height, width, and default

editorImageUrl, as well as the recordDefinition parameter. You can include a


maximum of 100 fields in your record definition. See: Bulk API Limits for more information.
The height and width parameters define the size of the content instance when rendered, while

editorImageUrl specifies the URL for an image that Eloqua will display in the editor's design
surface. editorImageUrl is not a templated URL.

{
"recordDefinition": {
"ContactID": "{{Contact.Id}}"
},
"height": 256,
"width": 256,
"editorImageUrl": "https://example.com/image.png"
}

2.4.3 Cloud API call from AwesomeApp


When a user clicks the edit button on the service instance and makes changes through the Configure
URL that require an updated recordDefinition DTO, AwesomeApp must call out to Eloquas Cloud API

PUT /contents/instances/{id} endpoint with that updated DTO:


PUT
https://secure.eloqua.com/api/cloud/1.0/contents/instances/f82d5
0cd-86a9-4fca-b37e-4ec9a98b0339
{
"recordDefinition": {
"ContactID": "{{Contact.Id}}",
"EmailAddress": "{{Contact.Field(C_EmailAddress)}}",
},
"height": 256,
"width": 256,
"editorImageUrl": "https://example.com/image.png"
}

2015 Oracle Corporation. All rights reserved

32 of 85

2.4.4 Notification URL Call and Response


Eloquas call to the Notification URL transmits the requested fields in the items parameter:

POST
https://example.com/awesomeapp/decide/notify?instance=f82d50cd86a9-4fca-b37e-4ec9a98b0339&asset=456
{
"offset": 0,
"limit": 1000,
"totalResults": 2,
"count": 2,
"hasMore": false,
"items":
[
{
"ContactID": "1",
"EmailAddress": "[email protected]"
},
{
"ContactID": "2",
"EmailAddress": "[email protected]"
}
]
}
For Content services, AwesomeApp's response will depend on whether the content is for an Email or a
Landing Page:
For Landing Pages, the response is a 200 status code with text/html content inline. If the response
takes too long, Eloqua uses the default content for that contact.
For Email, AwesomeApp can respond in one of two ways:

Inline Response: A 200 status code with text/html content inline, in which case Eloqua uses the
same content for each contact (this is the same response type as used for landing pages), or

Asynchronous Response: A 204 status code, indicating that the call was accepted, but there is
no content to return directly. The service should process asynchronously and then call the
{callbackUrl} parameter with contact-specific content.

Inline Response
The inline response for landing pages and email is a 200 status code, followed by the text/html content.
For example:

{
<div>

2015 Oracle Corporation. All rights reserved

33 of 85

<h1>External Content</h1>
<p>This content is used for all recipients for this
request.</p>
</div>
}

Asynchronous Response
For the asynchronous response, AwesomeApp responds with a 204 status code, indicating that the
response will be asynchronous, followed by one or more imports to Eloqua's Bulk API, where contactspecific content is updated with the ContactId and the instance Id, mapping the contact to the new
html content.

The maximum import size per batch is 50,000. If you have more than 50,000 contacts, break
your data up into multiple imports.

1. Create the bulk import definition, including a Content parameter whose value is the service
instance ID and execution ID. Including the execution ID enables you to differentiate between
different uses of the asset, for example, when multiple campaigns use the same email template
that contains the service instance:

POST https://secure.eloqua.com/api/bulk/2.0/contacts/imports
?
{
"name": "AwesomeApp Content Response Bulk Import",
"updateRule": "always",
"fields": {
"EmailAddress": "{{Contact.Field(C_EmailAddress)}}",
"Content": "{{ContentInstance
(f82d50cd86a94fcab37e4ec9a98b0339).Execution[21]}}"
},
"identifierFieldName": "EmailAddress"
}
Eloquas response will be a 201 Created response that includes a uri parameter, which you
can use to identify the import:

HTTP/1.1 201 Created


{
"name" : "AwesomeApp Content Response Bulk Import",
"updateRule" : "always",
"fields" : {

2015 Oracle Corporation. All rights reserved

34 of 85

"EmailAddress" : "{{Contact.Field(C_EmailAddress)}}",
"Content" : "{{ContentInstance
(f82d50cd86a94fcab37e4ec9a98b0339).Execution[21]}}"
},
"identifierFieldName" : "EmailAddress",
"isSyncTriggeredOnImport" : false,
"isUpdatingMultipleMatchedRecords" : false,
"uri" : "/contacts/imports/6",
"createdBy" : "DocsExample",
"createdAt" : "2014-03-06T13:59:00.6600046Z",
"updatedBy" : "DocsExample",
"updatedAt" : "2014-03-06T13:59:00.6600046Z"
}
2. Send Eloqua the data for import, using the Content parameter with the content the Eloqua
should use for each contact:

POST
https://secure.eloqua.com/api/bulk/2.0/contacts/imports/6/da
ta
[
{
"EmailAddress" : "[email protected]",
"Content" : "<p>This is the content for Fred</p>"
},
{
"EmailAddress" : "[email protected]",
"Content" : "<p>This is the content for Sylvie</p>"
}
]
3. Synchronize the data for import:
AwesomeApps request:

POST https://secure.eloqua.com/api/bulk/2.0/syncs
{
"syncedInstanceURI":"/contacts/imports/6",
}

2015 Oracle Corporation. All rights reserved

35 of 85

Eloquas Response:

201 Created
{
"syncedInstanceURI" : "/contacts/imports/6",
"status" : "pending",
"createdAt" : "2014-01-01T13:59:07.1375620Z",
"createdBy" : "DocsExample",
"uri" : "/syncs/6"
}
4. You can then use the syncs uri (/syncs/6) to check the status of the sync:

GET https://secure.eloqua.com/api/bulk/2.0/sync/6
For a full description of the sync status codes, see: Bulk API Sync Status Codes
When the sync is complete, Eloquas response will resemble:

200 OK
{
"syncedInstanceURI" : "/contacts/imports/6",
"syncStartedAt" : "2014-01-01T13:59:07.1375620Z",
"syncEndedAt" : "2014-01-01T13:59:14.1375620Z",
"status" : "success",
"createdAt" : "2014-01-01T13:59:07.1375620Z",
"createdBy" : "DocsExample",
"uri" : "/syncs/6"
}
If you run into trouble or have questions about theBulk API, check out theBulk APIdocumentation.

2.5 Develop an OracleEloqua AppCloudFeeder Service


Feeders allow external systems to determine and control which contacts enter into a campaign, and
when. Developers can now build apps that utilize data in third-party systems to drive campaign
membership
Feeders follows the instantiation-execution model. The following sections describe Feeder-specific
details and provide the endpoints needed to develop a Feeder service. If you are not familiar with the

2015 Oracle Corporation. All rights reserved

36 of 85

general flow for the instantiation-execution model, you should read that first.
Eloqua signs all outgoing calls with OAuth 1.0a so the receiving system can validate that the call was
sent by Eloqua. Refer to the OAuth 1.0a spec or OAuth 1.0 RFC for more information.

2015 Oracle Corporation. All rights reserved

37 of 85

2015 Oracle Corporation. All rights reserved

38 of 85

2.5.1 CreateURL call and response


Eloquas call to the CreateURL:

POST
https://example.com/awesomeapp/feeder/create?siteid=123instance=
9347bfe1-9c72-409c-a5cd-402ff74f0caa
{}
AwesomeApps response is 200-level HTTPresponse:

HTTP/1.1 200 Ok

2.5.2 Notification URL Call and Response


Eloqua's call to the Campaign Status Notification URL tells AwesomeApp that the campaign (or
campaigns if the service is in multiple campaigns) is active and ready to receive contacts:

POST
https://example.com/awesomeapp/decide/notify?instance=9347bfe19c72-409c-a5cd-402ff74f0caa&asset=456&status=active
AwesomeApp responds with a 204 response, indicating that the response will be asynchronous,
followed by an import to Eloqua's Bulk API, where AwesomeApp specifies a sync action. For
AppCloud Feeders, the sync action sets the AppCloud Feeder instance's status to markComplete.
Note that the maximum import size per batch is 50,000: if you have more than 50,000 contacts, break
your data up into multiple batches.

Bulk API Import


1. Create the bulk import definition, setting the status of the AppCloud Feeder instance to
markComplete. The "destination" field refers to the AppCloud Feeders service's instance - in
this example, the instance ID is 9347bfe1-9c72-409c-a5cd-402ff74f0caa:

When referencing service instances, you must transmit theGUID without dashes. The
Bulk APIwill error if you transmit the GUID with the dashes.

POST https://secure.eloqua.com/api/bulk/2.0/contacts/imports
?
{

2015 Oracle Corporation. All rights reserved

39 of 85

"name" : "AwesomeApp Feeder Bulk Import",


"updateRule" : "always",
"fields" : {
"emailAddress" : "{{Contact.Field(C_EmailAddress)}}"
}
"syncActions" : [
{
"destination" : "{{FeederInstance
(9347bfe19c72409ca5cd402ff74f0caa)}}",
"action" : "setStatus",
"status" : "markComplete"
}
],
"identifierFieldName" : "emailAddress"
}
Eloquas response will be a 201 Created response that includes a uri parameter, which you
can use to identify the import:

HTTP/1.1 201 Created

{
"name" : "AwesomeApp Feeder Bulk Import",
"updateRule" : "always",
"fields" : {
"emailAddress" : "{{Contact.Field(C_EmailAddress)}}"
},
"identifierFieldName" : "emailAddress",
"syncActions" : [
{
"destination" : "{{FeederInstance
(9347bfe19c72409ca5cd402ff74f0caa)}}",
"action" : "setStatus",
"status" : "markComplete"
}
],
"isSyncTriggeredOnImport" : false,
"isUpdatingMultipleMatchedRecords" : false,

2015 Oracle Corporation. All rights reserved

40 of 85

"uri" : "/contacts/imports/6",
"createdBy" : "DocsExample",
"createdAt" : "2014-03-06T13:59:00.6600046Z",
"updatedBy" : "DocsExample",
"updatedAt" : "2014-03-06T13:59:00.6600046Z"
}
2.

Send Eloqua the data for import as a using the uri:

POST
https://secure.eloqua.com/api/bulk/2.0/contacts/imports
/6/data
[
{
"emailAddress" : "[email protected]"
},
{
"emailAddress" : "[email protected]"
}
]
3. Synchronize the data for import:
AwesomeApps request:

POST https://secure.eloqua.com/api/bulk/2.0/syncs
{
"syncedInstanceURI":"/contacts/imports/6",
}
Eloquas Response:

201 Created
{
"syncedInstanceURI" : "/contacts/imports/6",
"status" : "pending",
"createdAt" : "2014-01-01T13:59:07.1375620Z",
"createdBy" : "DocsExample",
"uri" : "/syncs/6"
}

2015 Oracle Corporation. All rights reserved

41 of 85

4. You can then use the syncs uri (/syncs/6) to check the status of the sync:

GET https://secure.eloqua.com/api/bulk/2.0/sync/6
For a full description of the sync status codes, see: Bulk API Sync Status Codes
When the sync is complete, Eloquas response will resemble:

200 OK
{
"syncedInstanceURI" : "/contacts/imports/6",
"syncStartedAt" : "2014-01-01T13:59:07.1375620Z",
"syncEndedAt" : "2014-01-01T13:59:14.1375620Z",
"status" : "success",
"createdAt" : "2014-01-01T13:59:07.1375620Z",
"createdBy" : "DocsExample",
"uri" : "/syncs/6"
}
If you run into trouble or have questions about theBulk API, check out theBulk APIdocumentation.

2.6 Develop an OracleEloqua AppCloud Menu Service


The Menus service is all about Context. With Menus, you can build an App that enables a marketer to
launch an externally-hosted application from within Eloqua via a menu dock. This menu dock floats on
the right side of the screen in the Eloqua's Campaign Canvas or the asset editor screens.When a
marketer clicks on your Menu App, Eloqua calls out to your service via the action URL, passing along
context-specific data to your App.
Suppose AwesomeApp has a Menu service. When a marketing user click on AwesomeApp, theyre
directed to the call out URL, https://example.com/awesome/callout. The call includes

{UIContext}, which describes the context from which the service was accessed: who accessed
the menu service, from where within the Eloqua UI, etc. By default, the contextual information
includes:

siteId and siteName: these describe the Eloqua "site", generally the company or
organization of the user

userId and userName: the Eloqua username and id for the user who selected the Menu
service

2015 Oracle Corporation. All rights reserved

42 of 85

userCulture: the linguistic profile of the user. Eloqua uses Microsofts CultureInfo class to
define culture. For example, for English (United States), the code is en-US; for French
(Canada), fr-CA

assetId and assetName: the ID and name of the asset that the user was viewing when
they opened the Menu

assetType: the type of asset, that the user was viewing when they opened the Menu.
Assets include Account, Campaign, Contact, Landing Page, Template, and so on.
The actual call to AwesomeApp would then resemble:

GET https://example.com/awesome/callout
{
"siteId" : "123",
"siteName" : "Eloqua",
"userId" : "1234",
"userName" : "Docs.Example",
"userCulture" : "en-US",
"assetId" : "4",
"assetName" : "Docs Example Campaign",
"assetType" : "Campaign"
}
Eloqua signs all outgoing calls with OAuth 1.0a so the receiving system can validate that the call was
sent by Eloqua. Refer to the OAuth 1.0a spec or OAuth 1.0 RFC for more information.

2.7 Develop an OracleEloqua AppCloud Firehose Service


Eloquas Firehose service type enables third-parties to build a service that receives a notification when
a marketer performs an action in Eloqua. When a marketer creates a campaign or edits an email, for
example, Eloqua can call out to the third-party with the update.
Firehose supports subscriptions to a wide variety of events for the different asset types:
Email: Created, Updated
LandingPage: Created, Updated
ContactSegment: Created, Updated
Form: Created, Updated
Campaign: Created, Updated, Draft, DraftApproved, DraftWaitingApproval,
ActivatedBySchedule, CampaignLandingPageAdded, CampaignEmailAdded,
CampaignLandingPageRemoved, CampaignEmailRemoved

2015 Oracle Corporation. All rights reserved

43 of 85

When you configure your App, you specify which events to subscribe to in the pattern. Then, when a
marketer triggers one of those events, Eloqua calls out to the configured notification URL with the data
specified in the Firehose pattern.
For example, AwesomeApp has a Firehose service and is configured to request all campaign-related
events. The call to its notification URL would then resemble:

POST https://example.com/firehose
{
"siteId": "123",
"assetId": "9999",
"assetType": "Campaign",
"eventDate": "12/12/2014 12:00:01 AM",
"eventType": "Updated",
"userId": "1234",
"userName": "Docs.Example",
"msgAttributes": {
"name": "name_of_updated_asset",
"statuschangedby": "1234",
"statuschangedat": "12/12/2014 12:00:00 AM"
},
"oath_consumerkey": "stuff"
}
Eloqua signs all outgoing calls with OAuth 1.0a so the receiving system can validate that the call was
sent by Eloqua. Refer to the OAuth 1.0a spec or OAuth 1.0 RFC for more information.

2015 Oracle Corporation. All rights reserved

44 of 85

3 Register Your App


When you have developed an app and are ready to start testing it, you need to register it with Eloqua.
By now, you will have already registered as an App Provider in your Eloqua development instance.
Now, you need to register your app and services.
Once registered, you can test your Apps within your instance to make sure they work as expected, and
release the apps selectively or to the general public.

3.1 Step 1: Register the App


To register your app, select the Apps tab in the AppCloud Developer section of Eloqua.

If you have not yet registered any Apps, you will see a No apps have been defined message, and the
Create new App button. If you have already registered an App, it will be listed, alongside the Create
new App button. To register your App, click Create new App.

The Create App screen prompts you to fill in a number of fields that describe your App: the Apps
name and description, URL of its icon, and so on:

3.1.1 Details
These fields are general information about your App

2015 Oracle Corporation. All rights reserved

45 of 85

Icon URL:
Name:
Description:
Short Description:

3.1.2 Lifecycle
Enable URL: the URL called when the App is first installed or when it is reconfigured. This is a
templated URL which should include, at a minimum, the {InstallId}, {AppId}, and

{CallbackUrl} parameters. WIthout the callback URL you will not be able to complete the
installation flow if your app requires configuring (for example, to use OAuth).
Status URL: the URL called when a user checks the Apps status. See "Respond When
Eloqua Calls the Status URL" on page 67 for more about calls to the Status URL.

3.1.3 OAuth
Apps for the AppCloud use OAuth for authentication. For more information about configuring OAuth,
refer to the OAuth documentation.
Client ID (App id): Eloqua creates and assigns the App ID when you save your App.
Client Secret: Eloqua generates the secret access token when you save your App. Click Show
to view it.
Callback URL: the URL that the users should be redirected to after installing the app and
authenticating with Eloqua.
When youve filled in all fields, click Save, and your App will be listed on the Apps tab of the AppCloud
Developer area and on the AppCloud Developer landing page.

2015 Oracle Corporation. All rights reserved

46 of 85

3.2 Step 2: Register Services


Finally, you should register any services your app uses. The AppCloud Developer Platform currently
supports 6 services: Menus, Firehose, Content, Actions, Decisions, and Feeders.
Apps can include zero services, as in the case of a a portal app, or integration not directly tied to one of
the service types, for instance, or many services. If you are implementing services as part of your app,
you need to define them within Eloqua by clicking Add Services on the App Details page.

A modal window opens listing the available service types. Select the service type you wish to register.

Then, fill out the services details: you will have different information you need to supply depending on
the service you are implementing. For example, for a Menu, you need to provide the Action URL,

2015 Oracle Corporation. All rights reserved

47 of 85

specify the areas it supports and how Eloqua should present it, and provide the services icon URL,
name, and description; for Content, you will need to fill out instance configuration details, as well as
configure content and notification settings, as well as the general service details. The following
documents describe the service configuration page for each service type:
Menus
Content
Actions
Decisions
Feeders
Firehose
When you are done configuring your service, click Save. A green alert message will appear at the top
of the page indicating the Service has been successfully saved.

3.3 Step 3: View the App


You can view the App information by clicking its name in the list, in this example AppCloud Docs

Example App, which brings up the App Details page.

2015 Oracle Corporation. All rights reserved

48 of 85

The App Page shows all of the App information, including Services, and now includes Publish and
Catalog sections, which are used to grant access to the App. When you register an App, it immediately
becomes available in your instance of Eloqua so you can test it before releasing it to any other
prospective users. When youre ready to release your App, or just to share it with a select few, check
out the App installation tutorial.

3.4 Register an Action Service


With Actions, developers can build apps that control an external action that occurs when contacts
enter a step on the campaign canvas. Examples of this could include sending contacts SMS
messages, a direct mail piece, or registering them for webinars. When contacts enter an action step,
Eloqua will call out to the app, and the app can respond by performing an action in an external system,
then informing Eloqua that the process is complete. The contact will then move on in the workflow.
Actions are the next generation of Eloquas popular Cloud Connectors framework.
When you set up an Action service, you will need to provide the usual OracleEloqua AppCloud
Developer framework service details, as well as the Instance Configuration and Action Settings.

2015 Oracle Corporation. All rights reserved

49 of 85

3.4.1 Service Details


These fields are present for all services:
Icon URL: the URL of the icon that Eloqua should display for your service. The icon will be
32px by 32px when displayed. It must be a secureURL.
Small Icon URL: the URL of the icon Eloqua displays when you service is pinned as a favorite
on the campaign canvas.The icon will be 16px by 16px when displayed. It must be a
secureURL.
Name: the name of the service
Description: describes what the service does

3.4.2 Instance Configuration


This section defines the URLs for creating, configuring, copying, and deleting an instance of your
service. The installation tutorial details the instance creation flow when a marketer drags an Action
step onto the canvas, and selects your app.
Each URL is a templated URL that uses common URL template parameters and some Eloqua Markup
Language parameters. Eloqua replaces these paramters with their appropriate values when it makes a
call. For more about URL templating, See "Introduction to URL Templating" on page 12.

Create URL: templated URL pointing to a web poral for creating an instance of this service as
an HTTP POST request. All common URL template parameters are available.
You should be sure to included, at a minimum, the {InstanceId} parameter so that you will
be able to identify the service in the future. On success, this endpoint should return a 200-level
response with the created instance.
Configure URL: templated URL pointing to an endpoint for configuring an instance of this
service as an HTTP GET request. All common URL template parameters are available.

2015 Oracle Corporation. All rights reserved

50 of 85

You should be sure to included, at a minimum, the {InstanceId} parameter so that you will
be able to identify the service in the future.
Delete URL: templated URL pointing to an endpoint for deleting an instance of this service
using an HTTP DELETE request. All common URL template parameters are available. On
success, this endpoint should return a 200-level response.
Copy URL: templated URL pointing to an endpoint for creating an instance of this service as an
HTTP POST request. All common URL template parameters are available in addition to

{OriginalInstanceId}, {OriginalInstallId}, {OriginalAssetId},


and {OriginalAssetName}.
You should be sure to include, at a minimum, the {InstanceId} and

{OriginalInstanceId} parameters so that you can identify the original and newlycreated instances. On success, this endpoint should return a 200-level response with the
created instance. See "Respond When a Marketer Copies a Service Instance" on page 68 for
more information.

3.4.3 Action Settings

Notification versus Polling: Specify whether Eloqua should call out to your service when a
member arrives in an Action Step, or whether you will poll for members periodically.

2015 Oracle Corporation. All rights reserved

51 of 85

Notification URL: This url will be called (HTTP POST) when actions are taken on an instance
of this service. This endpoint should return a 2xx level response with an empty body on
success. If this property is not specified, the system will fall back to a polling style approach
without notification. Note that this url can be used along with the recordDefinition
property of the instance to send data.
Notification Content-Type: specifies the content type that the HTML POST request should
use, either application/json or text/csv
Max Records per Notification: number of records to push per HTTP request (between 0 and
50,000)
Status on Notification: specifies what the members status should be set to when a
notification is set. This is only valid if Max Records per Notification is greater than 0. If you set
the Status on Notification to Complete, Eloqua will call out to the notification URLwhen
contacts flow into the action step, and will then push the contacts directly into the next step. If
you set it to Active, you will need to call back into Eloqua to set each contact's status to
complete so they will flow into the next step. See:Develop an Action Service for more
information.
When youre done configuring your service, click Save. A green alert message will appear at the top of
the page indicating the service has been successfully saved.

3.5 Register a Decision Service


With Decisions, developers can build apps that directly control the path a contact takes as they flow
through a campaign. For instance, you could build an App that Eloqua calls out to when contacts reach
a Decision step. This App might interact with an external system, and evaluate rules against that set of
external data. The App then responds, telling Eloqua whether the contacts should flow through the
steps yes or no path. With Decisions, the data used in the decision never needs to be brought into
Eloqua.
When you set up a Decision service, you will need to provide the usual AppCloud Developer
framework service details, as well as the Instance Configuration, Content-Type of the notification
POST call and Decision Settings.

3.5.1 Service Details


These fields are present for all services:
Icon URL: the URL of the icon that Eloqua should display for your service. The icon will be
32px by 32px when displayed. It must be a secureURL.

2015 Oracle Corporation. All rights reserved

52 of 85

Small Icon URL: the URL of the icon Eloqua displays when you service is pinned as a favorite
on the campaign canvas.The icon will be 16px by 16px when displayed. It must be a
secureURL.
Name: the name of the service
Description: describes what the service does

3.5.2 Instance Configuration


This section defines the URLs for creating, configuring, copying, and deleting an instance of your
service. The installation tutorial details the instance creation flow when a marketer drags an Decision
step onto the canvas, and selects your app.
Each URL is a templated URL that uses common URL template parameters and some Eloqua Markup
Language parameters. Eloqua replaces these paramters with their appropriate values when it makes a
call. For more about URL templating, See "Introduction to URL Templating" on page 12.

Create URL: templated URL pointing to a web poral for creating an instance of this service as
an HTTP POST request. All common URL template parameters are available.
You should be sure to included, at a minimum, the {InstanceId} parameter so that you will
be able to identify the service in the future. On success, this endpoint should return a 200-level
response with the created instance.
Configure URL: templated URL pointing to an endpoint for configuring an instance of this
service as an HTTP GET request. All common URL template parameters are available.
You should be sure to included, at a minimum, the {InstanceId} parameter so that you will
be able to identify the service in the future.
Delete URL: templated URL pointing to an endpoint for deleting an instance of this service
using an HTTP DELETE request. All common URL template parameters are available. On

2015 Oracle Corporation. All rights reserved

53 of 85

success, this endpoint should return a 200-level response.


Copy URL: templated URL pointing to an endpoint for creating an instance of this service as an
HTTP POST request. All common URL template parameters are available in addition to

{OriginalInstanceId}, {OriginalInstallId}, {OriginalAssetId},


and {OriginalAssetName}.
You should be sure to include, at a minimum, the {InstanceId} and

{OriginalInstanceId} parameters so that you can identify the original and newlycreated instances. On success, this endpoint should return a 200-level response with the
created instance. See "Respond When a Marketer Copies a Service Instance" on page 68 for
more information.

3.5.3 Content-Type of Notification POST Call


Notification URL: A templated URL to an endpoint for notifying the external service, during execution,
to get the decision result of the configured instance. If this property is not specified, the system will fall
back to a polling style approach without any notification.

3.5.4 Decision Settings

2015 Oracle Corporation. All rights reserved

54 of 85

Notification versus Polling: Specify whether Eloqua should call out to your service when a
member arrives in the decision step, or whether your application will poll for members
periodically.
Notification Content-Type: specifies the content type that the HTML POST request should
use, either application/json or text/csv
Max Records per Notification: number of records to push per HTTP request (between 0 and
50,000)
Status on Notification: specifies what the members status should be set to when a
notification is set. This is only valid if Max Records per Notification is greater than 0.
When youre done configuring your service, click Save. A green alert message will appear at the top of
the page indicating the service has been successfully saved.

3.6 Register a Content Service


Content allows marketers to source pieces of content in Eloqua emails and Landing Pages, from an
external source. This is the new and improved version of Eloquas Cloud Components framework, and
it includes many improvements such as asynchronous bulk processing (for emails), the ability to fully
test the content service within Eloqua, and design-time interaction with the Email and Landing Page
editors. For instance, you can now re-size content in real time!
When you set up a Content service, you will need to provide the usual AppCloud Developer framework
service details, as well as the Instance Configuration and Content Settings.

3.6.1 Service Details


These fields are present for all services:
Icon URL: the URL of the icon that Eloqua should display for your service. The URL must be

https://
Name: the name of the service
Description: describes what the service does

3.6.2 Instance Configuration


This section defines the URLs for creating, configuring, copying, and deleting an instance of your
service. The installation tutorial details the instance creation flow when a creates a Landing Page or
Email populated with Content.

2015 Oracle Corporation. All rights reserved

55 of 85

Each URL is a templated URL that uses common URL template parameters and some Eloqua Markup
Language parameters. Eloqua replaces these paramters with their appropriate values when it makes a
call. For more about URL templating, See "Introduction to URL Templating" on page 12.

Create URL: templated URL pointing to a web poral for creating an instance of this service as
an HTTP POST request. All common URL template parameters are available.
You should be sure to included, at a minimum, the {InstanceId} parameter so that you will
be able to identify the service in the future. On success, this endpoint should return a 200-level
response with the created instance.
Configure URL: templated URL pointing to an endpoint for configuring an instance of this
service as an HTTP GET request. All common URL template parameters are available.
You should be sure to included, at a minimum, the {InstanceId} parameter so that you will
be able to identify the service in the future.
Delete URL: templated URL pointing to an endpoint for deleting an instance of this service
using an HTTP DELETE request. All common URL template parameters are available. On
success, this endpoint should return a 200-level response.
Copy URL: templated URL pointing to an endpoint for creating an instance of this service as an
HTTP POST request. All common URL template parameters are available in addition to

{OriginalInstanceId}, {OriginalInstallId}, {OriginalAssetId},


and {OriginalAssetName}.
You should be sure to include, at a minimum, the {InstanceId} and

{OriginalInstanceId} parameters so that you can identify the original and newlycreated instances. On success, this endpoint should return a 200-level response with the
created instance. See "Respond When a Marketer Copies a Service Instance" on page 68 for
more information.

2015 Oracle Corporation. All rights reserved

56 of 85

3.6.3 Content Settings

Default content: the HTML content the system should use if the external service is not
accessible. You can leave this field blank if no content is required.
Layout type: choose from flow or fixed. If you choose flow, the external content is input into
your landing page or email with no constraints (except width). If you choose fixed, the external

2015 Oracle Corporation. All rights reserved

57 of 85

content will be constrained in height and width, as specified by the content instance, and will not
be configurable from within Eloqua.
HTML Content-Type: specifies the content type that the HTML POST request should use,
either application/json or text/csv
Max record per notification: number of records to push per HTTP request (between 100 and
50,000)
Service Availability: specify if this service applies to Landing Pages, Email, or both.
Landing Page Notification (HTML) URL: templated URL that Landing Page engines should
call out to during render to retrieve the HTML content for the configured instance. In addition to
the common HTML template parameters, the Notification (HTML) URL supports the

{VisitorId}, {Fragment}, {Host}, {Query} and {Url} parameters. Be sure to


include, at a minimum, the the {InstanceId} and {ExecutionId} parameters so that
you will be able to call back in to Eloqua.
Email Notification (HTML) URL: templated URL that the Email engine should call out to during
render to retrieve the HTML content for the configured instance. Be sure to include, at a
minimum, the the {InstanceId} and {ExecutionId} parameters so that you will be
able to call back in to Eloqua.
If the landing page or email notification URL is not specified and a Landing Page or Email rendering is
required, the default content is used instead.
When youre done configuring your service, click Save. A green alert message will appear at the top of
the page indicating the service has been successfully saved.

3.7 Register a Feeder Service


With Feeders, developers can build apps that use data in third-party services to drive campaign
membership. When you set up a Feeder service, you will need to provide the usual AppCloud
Developer framework service details, as well as the Instance Configuration and Feeder Settings.

3.7.1 Service Details


These fields are present for all services:
Icon URL: the URL of the icon that Eloqua should display for your service. The icon will be
32px by 32px when displayed. It must be a secureURL.
Small Icon URL: the URL of the icon Eloqua displays when you service is pinned as a favorite
on the campaign canvas.The icon will be 16px by 16px when displayed. It must be a
secureURL.

2015 Oracle Corporation. All rights reserved

58 of 85

Name: the name of the service


Description: describes what the service does

3.7.2 Instance Configuration


This section defines the URLs for creating, configuring, copying, and deleting an instance of your
service. The installation tutorial details the instance creation flow when a marketer drags an Feeder
step onto the canvas, and selects your app.
Each URL is a templated URL that uses common URL template parameters and some Eloqua Markup
Language parameters. Eloqua replaces these paramters with their appropriate values when it makes a
call. For more about URL templating, See "Introduction to URL Templating" on page 12.

Create URL: templated URL pointing to a web poral for creating an instance of this service as
an HTTP POST request. All common URL template parameters are available.
You should be sure to included, at a minimum, the {InstanceId} parameter so that you will
be able to identify the service in the future. On success, this endpoint should return a 200-level
response with the created instance.
Configure URL: templated URL pointing to an endpoint for configuring an instance of this
service as an HTTP GET request. All common URL template parameters are available.
You should be sure to included, at a minimum, the {InstanceId} parameter so that you will
be able to identify the service in the future.
Delete URL: templated URL pointing to an endpoint for deleting an instance of this service
using an HTTP DELETE request. All common URL template parameters are available. On
success, this endpoint should return a 200-level response.
Copy URL: templated URL pointing to an endpoint for creating an instance of this service as an
HTTP POST request. All common URL template parameters are available in addition to

2015 Oracle Corporation. All rights reserved

59 of 85

{OriginalInstanceId}, {OriginalInstallId}, {OriginalAssetId},


and {OriginalAssetName}.
You should be sure to include, at a minimum, the {InstanceId} and

{OriginalInstanceId} parameters so that you can identify the original and newlycreated instances. On success, this endpoint should return a 200-level response with the
created instance. See "Respond When a Marketer Copies a Service Instance" on page 68 for
more information.

3.7.3 Feeder Settings

Campaign Status Notification URL: This URL is called (HTTP POST) when a campaign
containing an instance of the services status changes, such as when it is activated.
Be sure to include the {AssetId} and {EventType} parameters in the templated URL.

AssetId describes the campaign whose status has changed, and EventType defines the
status. When a campaign is activated, for example EventType will be Active. Otherwise,
you will not be able to identify what the incoming call references.
When youre done configuring your service, click Save. A green alert message will appear at the top of
the page indicating the service has been successfully saved.

3.8 Register a Menu Service


Eloquas Menus service is all about context. With Menus, you can build an App that enables a
marketer to launch an externally-hosted application from within Eloqua via a menu dock. This menu

2015 Oracle Corporation. All rights reserved

60 of 85

dock floats on the right side of the screen in the Eloquas Campaign Canvas or the asset editor
screens. When a marketer clicks on your Menu App, Eloqua calls out to your service on the specified
endpoint URL, passing along information about the asset or area from which your App was launched.
When setting up a Menu service, you will need to provide basic service details, as well as the Menu
Extension Service Details.

3.8.1 Menu Settings

Action URL: A templated URL that defines where users are redirected to when they select the
menu item. For example, a new tab with an external page showing information on a Campaign.
Always Show: Select this option to show the menu app no matter where the marketer is inside
of Eloqua.
Supported Areas: The assets/areas within Eloqua that your app will appear to the Marketer.
Layout: in the above screenshot, Vertical Large is selected. You can choose from Window
Open, which opens it in a new window or tab, Vertical Standard, which opens it within the

2015 Oracle Corporation. All rights reserved

61 of 85

actual AppCloud Menu dock, or Vertical Large, which opens it within the AppCloud Menu
dock, but in a larger form

3.8.2 Service Details


These fields are present for all services:
Icon URL: the URL of the icon that Eloqua should display for your service. The URL must be

https://
Name: the name of the service
Description: describes what the service does
When youre done configuring your service, click Save. A green alert message will appear at the top of
the page indicating the service has been successfully saved.

3.9 Register a Firehose Service


Firehose enables third-parties to build a service that receives a notification when a marketer performs
an action in Eloqua. This is essentially a web-hook that will be triggered when a marketer does things
like creating or editing a campaign, or creating or updating an email etc.

3.9.1 Service Details


These fields are present for all services:
Icon URL: the URL of the icon that Eloqua should display for your service. The URL must be

https://
Name: the name of the service
Description: describes what the service does

2015 Oracle Corporation. All rights reserved

62 of 85

3.9.2 Firehose Settings

Pattern: defines which events trigger a call out to the external application. The service
configuration page includes a list of valid asset types and the event types supported for each
asset, as well as examples of valid patterns.
Notification URL: the URL that Eloqua will call out to with the notification. This is a templated
URL.
When youre done configuring your service, click Save. A green alert message will appear at the top of
the page indicating the service has been successfully saved.

2015 Oracle Corporation. All rights reserved

63 of 85

4 Publish Your App


The final step in the App configuration lifecycle is publishing your App. The publishing flow has two
components: whitelisting users so that they are permitted to install the App, and retrieving the link that
those users need in order to add the App to their catalog.

4.1 Grant Access


By default, when you register an App with Eloqua, only your instance of Eloqua has access to it. This
makes it easy for you to test your App to ensure it is behaving as expected.
To allow other people access to the App, you have to formally grant access from the App Configuration
page.

You can choose between granting access to all Eloqua users, using the Publish To App Cloud button,
or to specific users using the Publish to Another Site button.

4.1.1 Publish To A Specific Site


1. Click the Publish to Another Site button. You will be directed to the whitelist page, with your site
name listed.

2015 Oracle Corporation. All rights reserved

64 of 85

2. Type the name of the site you want to add in the Give another Site access to [your app name]
box and click Add Site. All Eloqua Instances with that site name will now be able to install the
App.
3. To remove access, simply click the Publish to Another Site button, and then use the Remove
button to revoke access for that user.

4.1.2 Publish to All Sites


Click the Publish to App Cloud button, and all sites will be granted access to use your app. When you
click Publish to App Cloud, all sites are immediately whitelisted. At present, this cannot be undone.
Nevertheless, a Customer Admin will need the install URL before they can actually install the App.

4.2 Share the URL


Having published your App, giving sites the ability to install it, you now need to share the URL so that
users can add the App to their Eloqua instances App Catalog, giving marketers the ability to use it.
Eloqua automatically creates the installation URL when you register your App: it is at the bottom of the
App Details page within the AppCloud Developer area of your Eloqua Instance. Many developers send
the link by email to the Sites they have authorized; when an authorized user clicks the link, the App is
added to their catalog. The link will not work for users who are not authorized, so you dont need to
worry about people passing around the installation link to sites you did not whitelist.

4.3 Next Steps


When a customer admin installs an app on a new site, Eloqua calls out to the App's install URL. Refer
to the AppCloud Installation Flow tutorial for more information.

4.4 AppCloud Installation Flow


When a Customer Admin adds an App to their catalog, Eloqua calls out to the configured enable URL
with a POST request. The call will resemble the following:

https://example.com/awesomeapp/api/enable?enableurl&oauth_
consumerkey=key-key-key-key-key
&oauth_nonce=nonce&oauth_signature_method=SIG-METH&oauth_
timestamp=111111111

2015 Oracle Corporation. All rights reserved

65 of 85

&oauth_version=1.0&oauth_
signature=signature&callback=https://secure.eloqua.com/cloud/ena
ble/bla
The app must respond in one of two ways:if the app does not require configuring by the user, it can
return an HTTP200 OK response. Otherwise, it should respond with an HTTP 303 redirect to another
page.The following sections detail each option.

4.4.1 No AdditionalInformationNeeded
In this scenario, there is no need to obtain OAuth authorization for the installing user's instance, nor
any other configuration information. The appropriate response is then:

HTTP/1.1 200 OK
The app install status will be set to the "Ready"and marketers will be able to use it.

4.4.2 Additional Information Needed


If you need to have the user configure the application or provide OAuth authorization for their instance,
you should respond with an HTTP303 redirect to another page.When the app is configured, you need
to call back in to the callback URL.
1. Respond with a redirect:

HTTP/1.1 303 Redirect


If your app needed to go through the OAuth flow, the redirect might point to
login.eloqua.com/auth/oauth2/authorize, Eloquas OAuth endpoint. For instructions on how to
handle the OAuth flow, refer to the OAuth documentation. If you needed users to configure
options in the app when they install it, the redirect might point to a configure page within your
app.
2. Call in to the callback URLwhen the user has finished configuring the application:

https://secure.eloqua.com/cloud/enable/bla
Eloqua provides the callback URLwhen you request it as a template in your templated
enableURL. Calling the callbackURLtells Eloqua that the install status should be set to
"Ready" so that marketers can start using the application.

2015 Oracle Corporation. All rights reserved

66 of 85

4.5 Respond When Eloqua Calls the Status URL


When you register an App in Eloqua, you are required to specify a Status URL. This URL is an
endpoint in your App Eloqua can call to verify that the app is up and running.
Eloqua calls the Status URL when a user clicks the Status button for that App from the AppCloud
Catalog.

Applications have an application status associated with them. This status is either up,
down, or maintenance. Calls to the Status URL do not update the application status: they
merely display the applications response to the user who clicked the Status button.

4.5.1 Example
Suppose the user clicked the Status button for AwesomeApp. The call resembles:

GET https://example.com/awesomeapp/status
If AwesomeApp is operating normally, the appropriate response is an 200-level response:

HTTP/1.1 200 OK
Eloqua then displays the Status to the user in a modal window.

2015 Oracle Corporation. All rights reserved

67 of 85

Otherwise, if AwesomeApp is down and responds with a 400 or 500-level message, Eloqua indicates
that it was unable to connect to the application. Or that the application is in maintenance mode.

4.6 Respond When a Marketer Copies a Service Instance


Marketers often create new campaigns, landing pages, and emails from existing resources. When a
marketer creates a campaign, landing page, or email using the Save As option in the Campaign
Canvas and Landing Page or Email editors all of the objects in that resource are duplicated. For most
items on a canvas, this is straightforward. For services that follow the instantiation-execution model,
however, each instance has its own unique identifier. Thus, when an Action, Decision, Feeder, or
Content service instance is copied, a new GUID needs to be assigned to the copy. The OracleEloqua
AppCloud Developer Framework uses the Copy URL to communicate with the services provider to
configure and update the new service instance when a service is copied.

4.6.1 Sample Copy URL Call and Response


Eloquas call to the Copy URL is similar to the call to the CreateURL when a service is first created.
The following section provides step-by-step instructions for properly handling calls to the Copy URL.
This example uses a Decision service, but the process is the same for Actions,Content, and Feeders.
1. A marketing user copies a campaign that includes an AwesomeApp Decision Service whose
templated Copy URL is:

example.com/awesomeapp/decide/copy?instanceId={InstanceId}
&originalId={OriginalInstanceId}
2. Eloqua calls out to the Copy URL, replacing the templated parameters with the original
services GUID, and the new GUID of the copy. AwesomeApp can use the original services
GUID to determine the appropriate configuration options for the copy:

POST example.com/awesomeapp/decide/copy?instanceId=bcbdff6a74dd-41c9-b716-825e4049b776
&originalId=d155213e-cd30-422b-984c-acb33093cb5b
3. AwesomeApp responds in one of two ways: either it replies with an HTTP 200 Ok response,
and no content, in which case Eloqua will use the original services configuration for the new
service, or, AwesomeApp replies with a 200-level HTTP response along with a DTO specifying
how the new service should be configured, as in the following:

HTTP/1.1 200 OK
{

2015 Oracle Corporation. All rights reserved

68 of 85

"recordDefinition":
{
"ContactId": "{{Contact.Id}}",
"EmailAddress": "{{Contact.Field(C_EmailAddress)}}
"
}
}
Internally, Eloqua then updates the references in the campaign to the new service instance
GUID, and the new campaign is created.

4.6.2 Persistent Settings and Data


As an App provider, you have control over what data and settings are persisted when a service is
copied: if you wish to retain the configuration of the original service, simply return a blank DTO when
Eloqua calls out to the Copy URL. Conversely, if you wish to update the configuration of the new
service, you can do so by replying with a new DTO.
Once a service has been copied, and the new service has been configured, there is no link between
the original and new services: changing the configuration in one does not affect the other.

4.7 Scheduled Maintenance


If you need to perform maintenance on your app, and wish to put it into maintenance mode, you can do
so directly from the app's App Details page from within your Eloqua instance by clicking the
Shutdown App button.

2015 Oracle Corporation. All rights reserved

69 of 85

When an app is in maintenance mode,


Eloqua will not send any calls to the app
Marketers should not be able to add the app's services to a campaign, email, or landing page
When a user checks the app's status, Eloqua will inidcate the app is undergoing maintenance
App Shutdown is not equivalent to deactivating or deleting an app. It is, however, ideal if you wish to
suspend the app while performing an upgrade.

4.8 App Shutdown


If your app is not operating properly, OracleEloqua can shut down your app. This prevents marketers
from creating new campaigns that use your app's services. Marketers can also configure a default path
for contacts to follow in the event that a service is unavailable while a campaign is in progress.
See:Configuring Cloud Action and Decision Elements in the Eloqua product documentation for more
information. When an app is shutdown, any contacts in the app's service's steps will flow down the
default path, if it is configured.

2015 Oracle Corporation. All rights reserved

70 of 85

4.8.1 Shutdown
Eloqua will shut down your app if there were more than 100 calls in the last five minutes, and 25%
of them failed. Eloqua will automatically send an email message to the email address associated with
your provider, with a link you can use to reactivate your app. When the app is shut down, all pending
and future requests are marked as "failed".

4.8.2 Reactivate YourApp


To reactivate your app, simply click on the link in the notification email that Eloqua has sent.
Alternately, you can log into your development instance, and click the Start App button on the App
Details page in the AppCloud Developer Framework area of Eloqua.
You can also programatically start or stop your app using the GET /apps/{appid}

/configurations and PUT /apps/{appid}/configurations endpoints. See:


Programmatically Update your App's Status for more information.

4.9 Update or Check your App's Status Using theCloudAPI


From time to time, you may wish to update your App's status. While it is possible to start or stop your
app from the AppDetails page in the AppCloud Developer Framework area of your Eloqua
development instance, you can also do so programmatically using a CloudAPIendpoint. The endpoint
also enables you to check the status of your App. You will need to know your App's ID in order to call
out to the Cloud API endpoints. The App ID is listed on the AppDetails page in your Eloqua
development instance, and is a GUID.
The Cloud API URLis https://<eloqua base

url>.com/api/cloud/1.0/<endpoint>. All calls to the API must be authenticated using


OAuth. See:Authenticate with OAuth in the Bulk APIdocumentation for a full explanation.

4.9.1 To Check the App's Status


Retrieve your app's status using the GET/apps/{id}/configurations endpoint:

GET /apps/a0f6779e-8263-4bfb-a292-9714cd10d1e7/configurations
The response should resemble:

HTTP/1.1 200 OK
{

2015 Oracle Corporation. All rights reserved

71 of 85

"uri": "/apps/a0f6779e-8263-4bfb-a2929714cd10d1e7/configurations",
"clientSecret":
"a1ba63f9aae1cc84d91544f15b0af27ab6ced4e42c6145b9cc0425742ecf2a0
da1ba63f9aae1cc84d91544f15b0af27ab6ce",
"name": "Call Example",
"description": "This is a test",
"shortDescription": "This is a test",
"iconUrl": "https://www.example.com/logo.png",
"enableUrl": "http://example.com/enable/{appId}/{installId}/
{userName}/{siteName}/{siteId}",
"statusUrl": "http://example.com/status/{installId}",
"callbackUrl": "http://example.com/callback/{installId}",
"makeAvailableUrl": "https://example.com",
"publishedSites": [
"AwesomeCompany"
],
"status": "Up"
}
The status field indicates the app's current status, either "Up", "Down", or "Maintenance".

4.9.2 To Update the App's Status


Update the status by sending a request to the PUT/apps/{id}/configurations endpoint.

Important:You must include all of the fields in the configuration document in thePUT request.
You cannot merely specify a value for the status field.

The status can be "Up", "Down", or "Maintenance":

PUT /apps/a0f6779e-8263-4bfb-a292-9714cd10d1e7/configurations
{
"uri": "/apps/a0f6779e-8263-4bfb-a2929714cd10d1e7/configurations",
"clientSecret":
"a1ba63f9aae1cc84d91544f15b0af27ab6ced4e42c6145b9cc0425742ecf2a0
da1ba63f9aae1cc84d91544f15b0af27ab6ce",
"name": "Call Example",
"description": "This is a test",
"shortDescription": "This is a test",
"iconUrl": "https://www.example.com/logo.png",
"enableUrl": "http://example.com/enable/{appId}/{installId}/
{userName}/{siteName}/{siteId}",
"statusUrl": "http://example.com/status/{installId}",
"callbackUrl": "http://example.com/callback/{installId}",

2015 Oracle Corporation. All rights reserved

72 of 85

"makeAvailableUrl": "https://example.com",
"publishedSites": [
"AwesomeCompany"
],
"status": "Maintenance"
}
If successful, Eloqua will respond with an HTTP/1.1 204 No Content.
If you GET the /apps/{id}/configurations endpoint again, the response should reflect the
updated status.

2015 Oracle Corporation. All rights reserved

73 of 85

5 Frequently Asked Questions


5.1 General
5.1.1 Why shouldI develop apps for the OracleEloqua AppCloud?
The AppCloud Developer Framework is a complete development platform where you can easily build,
register, and deploy apps for Eloqua. With new and improved service types which take advantage of
Eloqua's Bulk API, support for OAuth, and the ability to test your applications with Eloqua prior to
launch, the AppCloud Developer Framework provides the environment needed to put apps first.

5.1.2 What permissions do Ineed to start developing apps for the


OracleEloqua AppCloud?
At the minimum, you need access to an Eloqua instance. If you are not currently an Eloqua user, you
can sign up as a technology partner to obtain a development instance. As a user, you will also need the
APIUsers and AdvancedUsers - Marketing permissions.

5.1.3 When and how doesmy app get listed on the OracleEloqua
AppCloud site?
See the Building Apps for the Oracle Marketing AppCloud on Topliners for detailed instructions.

5.1.4 How do marketers find my app to start using it?


When an app is listed on the AppCloud marketplace, marketers can find it at appcloud.eloqua.com.

5.1.5 Is there an OracleEloqua AppCloud certification program?


Yes there is!Check out the Oracle Marketing AppCloud Certification Program on Topliners.

2015 Oracle Corporation. All rights reserved

74 of 85

5.2 OracleEloqua AppCloud Services and Operations


5.2.1 Whichservice shouldI develop?
It depends on what you're trying to achieve! See "Service Descriptions" on page 10 for an overview of
each service and the use cases it supports.

5.2.2 What's the difference between OracleEloqua AppCloud services


and CloudConnectors orComponents?
Eloqua OracleEloqua AppCloud services greatly extend the functionality provided by
CloudConnectors and CloudComponents. Cloud Content replaces Cloud Components, allowing you
to process emails in bulk and test the service within Eloqua. Unlike CloudConnectors and
Components, the OracleEloqua AppCloud services use Eloqua's BulkAPIfor processing, greatly
improving performance and throughput.

5.2.3 Can Iinclude Campaign, Email, Landing Page, Form (etc) fields in
my record definition?
No. The OracleEloqua AppCloud exclusively supports Contact, Account, Activity and Custom Object
fields in its record definition fields. You must use the correct Eloqua MarkupLanguage statement to
reference each field.

5.2.4 Can Iinclude static values in my record definition?


No. You can only specify the Eloqua Markup Languagefor Eloqua fields.

5.3 Managing Your Apps


5.3.1 What happens if contacts are errored in an Action or Decision
step?What happens if the service is unavailable when contacts flow into a
step on the canvas?
The contacts remain in the step until the marketer manually pushes them into the next step on the
canvas.

2015 Oracle Corporation. All rights reserved

75 of 85

5.3.2 Does Eloqua notify me when someone uninstalls or deletes my app


from their Eloqua instance?
Not currently. Customers can uninstall and remove apps from their catalog, but the provider is not
notified when that occurs.

5.3.3 How do I delete an app that I have developed?


At present, you do not have the ability to delete an app once it is created in your Eloqua development
instance.
However, unless you have whitelisted a site and given out the install URL, no one will be able to install
the app. It is also possible to "Shutdown" an app and place it into maintenance mode, but this is not
equivalent to deletion.

5.3.4 Why is my app shut down?


If in the last five minutes, there were more than 100 calls, and 25% of them failed, the app will be shut
down. All the pending and future requests will be marked as failed. See "App Shutdown" on page 70 for
more information.

5.3.5 Will Eloqua retry my contacts if my app doesn't respond?


If Eloqua calls out to your app and receives five consecutive failures, the contacts in a step will be
marked as"Errored". If the marketer has configured a default path for the contacts to flow through, then
the contacts will flow into the next step.

5.4 Limits
5.4.1 Are there limits that I should be aware of?
The AppCloudDeveloper Framework relies on the Bulk API. The Bulk APIhas limits on the size of the
staging area for imports and exports, on the amount of data you can import at one time, and on the
number of fields you can include in a record definition. There is also a daily limit on the number of syncs
you can perform. See: Bulk API Limits for more information.

2015 Oracle Corporation. All rights reserved

76 of 85

5.4.2 What happens if Ireach the daily sync limits?


The daily sync limit is not currently enforced, but syncs are logged and monitored.

2015 Oracle Corporation. All rights reserved

77 of 85

6 Reference
6.1 URL Parameters
These parameters are available to use in templated URLs. See "Introduction to URL Templating" on
page 12 for more information.

6.1.1 GeneralParameters
Url Parameter

Description

GUID that
describes the
InstanceId
specific
instance of the
service
GUID that
describes the
InstallId
instance of the
App
ID of the
AssetId
referencing
asset
Name of the
AssetName
referencing
asset
Type of the
referencing
asset
AssetType
(Campaign,
form, landing
page)
Specific to
Copy URL OriginalInstanceId provides
original

Supported?
Firehose Decisions Actions Feeders Menus Content

No

Yes

Yes

Yes

No

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

No

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

No

Yes

Yes

Yes

No

Yes

No

Yes

Yes

Yes

No

Yes

No

Yes

Yes

Yes

No

Yes

InstanceId
Specific to
Copy URL OriginalInstallId provides
original

InstallId
OriginalAssetId

Specific to
Copy URL -

2015 Oracle Corporation. All rights reserved

78 of 85

Url Parameter

Description

Supported?
Firehose Decisions Actions Feeders Menus Content

provides
original

AssetId
Specific to
Copy URL OriginalAssetName provides
original

No

Yes

Yes

Yes

No

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

No

No

Yes1

No

No

AssetName
UserName

UserId

UserCulture

SiteName

SiteId

AppId

EventType

Name of the
user that
Yes
triggered the
call
ID of the user
that triggered Yes
the call
Culture of the
user that
No
triggered the
call
Name of
Eloqua
instance the
Yes
user comes
from
GUID-based ID
for the Eloqua
instance the
Yes
user comes
from
GUID-based ID
Yes
of that app
Status change
that triggered
the call
Yes
(Created,
Activated,
Draft, etc.)

6.1.2 App-Specific Parameters


Url Parameter

CallbackUrl

Description
URL that app must call into when the app configuration is complete during
installation. Should always be included in enable URL during App Registration.

1Feeders only support the Created, Activated, Draft, and Complete events.

2015 Oracle Corporation. All rights reserved

79 of 85

6.1.3 Content-Specific Parameters


Url Parameter

Description

Notes

ExecutionId Identifies a unique email send execution


Specifies the different types of email render. Possible values
are:

0: no render
1: EmailSend
2: LiveWeb
3: EmailPreview
4: WebPreview
5: EmailSaved

RenderType

Unique to
EmailNotification
URL

Specifies if email is in preview mode. Possible values are:

IsPreview

VisitorId

6.2 PUT

Unique to
EmailNotification
URL

0: False
1: True
IDof the visitor for whom you wish to construct a landing page

Unique to
Landing Page
Notification URL

/actions/instances/{id}

Updates an OracleEloqua AppCloud Action service instance.

6.2.1 URL parameters


name

id

type
GUID

description
Unique identifier for that service instance

6.2.2 Request Body


name

recordDefinition

type
description
Dictionary Defines the mapping between your fields and Eloqua's
of strings fields

2015 Oracle Corporation. All rights reserved

80 of 85

6.2.3 Example
Update the record definition of the AppCloud action instance withGUID 7b95fe48-6598-

43e8-8fd1-dcb40cf83ef6
PUT /actions/instances/7b95fe48-6598-43e8-8fd1-dcb40cf83ef6
{
"recordDefinition": {
"ContactID": "{{Contact.Id}}",
"EmailAddress": "{{Contact.Field(C_EmailAddress)}}",
}
}

6.3 PUT

/contents/instances/{id}

Updates an OracleEloqua AppCloud Content service instance.

6.3.1 URL parameters


name

id

type
GUID

description
Unique identifier for that service instance

6.3.2 Request Body


name

recordDefinition
height
width
editorImageUrl

type
description
Dictionary Defines the mapping between your fields and Eloqua's
of strings fields
Integer
Height of the image
Integer
URL

2015 Oracle Corporation. All rights reserved

Width of the image


URL of the image to display in the Landing Page and Email
editor

81 of 85

6.3.3 Example
Update the record definition of the AppCloud content instance withGUID 7b95fe48-

6598-43e8-8fd1-dcb40cf83ef6
PUT /contents/instances/7b95fe48-6598-43e8-8fd1-dcb40cf83ef6
{
"recordDefinition": {
"ContactID": "{{Contact.Id}}",
"EmailAddress": "{{Contact.Field(C_EmailAddress)}}",
},
"height": 256,
"width": 256,
"editorImageUrl": "https://example.com/image.png"
}

6.4 PUT

/decisions/instances/{id}

Updates an OracleEloqua AppCloud decision service instance.

6.4.1 URL parameters


name

id

type
GUID

description
Unique identifier for that service instance

6.4.2 Request Body


name

recordDefinition

type
description
Dictionary Defines the mapping between your fields and Eloqua's
of strings fields

6.4.3 Example
Update the record definition of the AppCloud decision instance withGUID 7b95fe48-

2015 Oracle Corporation. All rights reserved

82 of 85

6598-43e8-8fd1-dcb40cf83ef6
PUT /decisions/instances/7b95fe48-6598-43e8-8fd1dcb40cf83ef6
{
"recordDefinition": {
"ContactID": "{{Contact.Id}}",
"EmailAddress": "{{Contact.Field(C_EmailAddress)}}",
}
}

6.5 GET

/apps/{id}/configurations

Retrieves an OracleEloqua AppCloud App configuration.

6.5.1 URL parameters


name

id

type
GUID

description
Unique identifier for that service instance

6.5.2 Request Body


None.

6.5.3 Example
Retrieve the App configuration file for the App with GUID 7b95fe48-6598-43e8-8fd1-

dcb40cf83ef6
GET /apps/7b95fe48-6598-43e8-8fd1dcb40cf83ef6/configurations

2015 Oracle Corporation. All rights reserved

83 of 85

6.6 PUT

/apps/{id}/configurations

Updates an OracleEloqua AppCloud App configuration.

Warning:changes to the configuration file directly affect the app. Accidentally changing the

enableUrl, for example, will result in people being unable to install your app. Ensure that
any changes you push out are intentional.

6.6.1 URL parameters


name

id

type
GUID

description
Unique identifier for that service instance

6.6.2 Request Body


name

uri
clientSecret
name
description
shortDescription
iconUrl
enableUrl
statusUrl
callbackUrl
makeAvailableUrl
publishedSites
status

URI

type

description
specific URIthat describes the app

token

Eloqua-generated OAuth token

string

name of the app

string

description of the app

string

a brief description of the app


URL pointing to the icon that Eloqua should
URL
display for the app
URL called when the App is first installed or when
templated URL
it is reconfigured
templated URL
URL called when a user checks the apps status
URL that the users should be redirected to after
templated URL
installing an app
Eloqua-generated URL used to add the app to a
URL
user's catalogue
dictionary of strings lists the sites where the app is installed
Describes the status of the App - either "Up",
string
"Down", or "Maintenance".

6.6.3 Example
Set the status for the App with GUID 7b95fe48-6598-43e8-8fd1-dcb40cf83ef6

2015 Oracle Corporation. All rights reserved

84 of 85

to Down.

PUT /apps/7b95fe48-6598-43e8-8fd1dcb40cf83ef6/configurations
{
"uri": "/apps/a0f6779e-8263-4bfb-a2929714cd10d1e7/configurations",
"clientSecret":
"a1ba63f9aae1cc84d91544f15b0af27ab6ced4e42c6145b9cc0425742ec
f2a0da1ba63f9aae1cc84d91544f15b0af27ab6ce",
"name": "Call Example",
"description": "This is a test",
"shortDescription": "This is a test",
"iconUrl": "https://www.example.com/logo.png",
"enableUrl": "http://example.com/enable/{appId}/
{installId}/{userName}/{siteName}/{siteId}",
"statusUrl": "http://example.com/status/{installId}",
"callbackUrl": "http://example.com/callback/{installId}
",
"makeAvailableUrl": "https://example.com",
"publishedSites": [
"AwesomeCompany"
],
"status": "Down"
}

2015 Oracle Corporation. All rights reserved

85 of 85

You might also like