Publisher API

Publisher API v2.3

1.0 Scope

This document contains the technical information required for accessing the RESTful API offered by Convertr. Currently, the main goal of this API is to feedback live stats to our network and facilitate the delivery of new customer records.

It should be noted that all reporting information gathered from the use of this API are unconfirmed and should be used merely as an awareness tool while running a campaign with us.

2.0 Enterprise URL

This version of the API is accessible from the following URL, at this point, there is a single entry point for all requests.

https://{enterprise}.cvtr.io/api/v2/

3.0 Usage & Examples

3.1 Prerequisites

All Publisher users by default have access to the Convertr Publisher API. Your access credentials are available from the Convertr Dashboard.

3.2 Authentication Token

In order for you to query the API, all request must be sent with an authentication token.

This needs to be requested from the following URL using a POST request. Once the token has been returned, it will expire after 60 minutes.

Request

POSThttps://{enterprise}.cvtr.io/api/login


ParameterRequiredDescription
usernameYesYour username
passwordYesYour password
mfa_tokenNoMFA token supplied if MFA is enabled on your account.
mfa_codeNoYour MFA SMS code if MFA is enabled on your account.

Example Post

POST: https://{enterprise}.cvtr.io/api/login
username: {USERNAME}
password: {USER_PASSWORD}

curl -X POST \
https://{enterprise}.cvtr.io/api/login \
-d 'username={USERNAME}&password={PASSWORD}'

If Multifactor Authentication (MFA) is active on your account, you will receive the mfa_token and mfa_code by making the above request with only the required parameters. This will return the below response, with the mfa_code sent via SMS to the number listed on the user account.

Response

{
    "error": "Mfa Required",
    "error_description": "Multifactor authentication required",
    "mfa_token": "MmE3Mzk0ODk0ODU4OWQ0MTAxNDBmNGE0YzExZDdlYjYzMzhhZDFlM2MzNDBiNjU4NzFlZTM1MzcxNTZkZThhNw"
}


You can then use these parameters to make a second complete request and retrieve the token.

Response

{
    "access_token": "MDU1OGViMzJhNmNiYWVhODdjZjA3M2EwNTQ1NDQ5ZjQ0YTJhNDQxMzNhZTcyNWIxNDJjMjJjZmM5YjhhNmU0Mw",
    "expires_in": 3600,
    "token_type": "bearer",
    "scope": null,
    "refresh_token": "N2QwYWZlOTliYThmZmQwNDRhNDcyMGQwZGU0ZjlhODlkMGI4OGQwODIzYjNlMDUzYWMxY2RlZWI0MmVlZTMwNw",
    "client_id": "xxxxxxxxxxxxxxxxxxxxxx",
    "client_secret": "xxxxxxxxxxxxxxxx",
    "user_id": 167,
    "password_expired": false,
    "expires_ts": 1621853938
}



You can also authenticate via OAuth2.0. This needs to be requested from the following URL using a GET request. Once the token has been returned, it will expire after 60 minutes.

Request


ParameterRequiredDescription
client_idYesClient ID which is supplied on a platform-wide basis
client_secretYesClient Secret which is supplied on a platform-wide basis
api_keyYesAPI Key that is unique to each user

Response

{
    "access_token": "ODM5NTIwNjk1MjdhNTMzMzk0MTY2Y2ZkYjg2OWFlN2Y5YzZlNTk1NmUwZmVjOGRkMDhhMzllYTA2ZTA0MDI3Zg",
    "expires_in": 3600,
    "refresh_token": "YTQzODk3MDdiM2FhMGYzODYyOTcyOTBkYWZiZWI3YzJmNmEwYmJkYWJiM2I0NzU1Y2Q5OTcwZDA0YzhiZGNjYQ",
    "scope": null,
    "token_type": "bearer"
}

Additionally, a token can be requested using user credentials. In order to do that, you need to send a POST request to

Request

POST

https://{enterprise}.cvtr.io/oauth/v2/token

ParameterRequiredDescription
client_idYesClient ID which is supplied on a platform-wide basis
client_secretYesClient Secret which is supplied on a platform-wide basis
api_keyYesAPI Key that is unique to each user
grant_typeYesMust be set to "password"
usernameYesYour username
passwordYesYour password

3.3 Form Fields Endpoint

This API call will supply an array of forms that are available to `POST` leads to (see section 3.5) on a given campaign.
The response will allow you to see which form fields are available to populate each form (each campaign can have multiple forms).

Request


ParameterRequiredDescription
CAMPAIGN_IDYesID for the campaign you are wishing to see a list of available forms
ACCESS_TOKENYesAccess token acquired in 3.2

Response

[
    {
        "fields": [
            "form[firstName]",
            "form[email]",
            "form[lastName]",
            "form[submit]"
        ],
        "formId": 35,
        "formName": "Acme Campaign - Simple Form"
    },
    {
        "fields": [
            "form[promotion]",
            "form[title]",
            "form[firstName]",
            "form[lastName]",
            "form[email]",
            "form[lookup][addressLine1]",
            "form[lookup][addressLine2]",
            "form[lookup][addressLine3]",
            "form[lookup][addressLine4]",
            "form[lookup][postcode]",
            "form[telephone][countryCode]",
            "form[telephone][telephone]",
            "form[submit]"
        ],
        "formId": 23,
        "formName": "Acme Campaign - Advanced Form"
    }
]


3.4 Campaign Links Endpoint

This API method will return an array of available links for the given campaign. Links are required as it provides insight into which channel a lead entered the Convertr Platform or was captured.

Request

ParameterRequiredDescription
CAMPAIGN_IDYesID for the campaign you are wishing to see a list of available links
ACCESS_TOKENYesAccess token acquired in 3.2

Response

[
    {
        "channel": "Email",
        "destination": "https://convertrforms.cvtr.io/acme-campaign-email",
        "id": 25,
        "name": "acme-campaign-email"
    },
    {
        "channel": "Social",
        "destination": "https://convertrforms.cvtr.io/acme-campaign-social",
        "id": 26,
        "name": "acme-campaign-social"
    },
    {
        "channel": "Display",
        "destination": "https://convertrforms.cvtr.io/acme-campaign-display?template=1&wp=4",
        "id": 30,
        "name": "acme-campaign-display"
    }
]

3.5 Campaign lead Endpoint

POST
https://[enterprise].cvtr.io/api/v2.3/publisher/[publisher_id]/forms/[form_id]/leads?linkId=[link_id]&access_token={ACCESS_TOKEN}


ParameterRequiredDescription
PUBLISHER_IDYesPublisher id sending the request
LINK_IDNoLink to associate lead with (see section 3.2 or Publisher Media Kit email)
FORM_IDYesForm Id to match body to (see section 3.3 or Publisher Media Kit email)
ACCESS_TOKENYesAccess token acquired in 3.2

Example Request Body

form%5BfirstName%5D=Danny&form%5BlastName%5D=Hannah&form%5Bemail%5D=tech%40convertrmedia.net&form%5Bsubmit%5D=true

Response

{
    "data": 367086,
    "message": "Lead was created successfully",
    "status": 201
}

When passing leads through the API, the form data must be passed in the body of the request. In addition, in the header you need to pass the following to encode the data:

NameValue
Content-Typex-www-form-urlencoded


3.6 Get Lead Result

After leads are saved to Convertr, they are queued and processed through the campaigns rules defined by the client. You can monitor the status of the lead being processed by performing the following request:

Request

GEThttps://{enterprise}.cvtr.io/api/v2.1/publisher/{PUBLISHER_ID}/lead-result/{LEAD_ID}?access_token={ACCESS_TOKEN}

Responses

ScenarioResponse codeResponse bodyDetail
Valid200""If the lead is deemed valid by Convertr we will return a 200 response with no body.
Pending202"The lead has not been processed yet. Please try again later."If the lead is still being processed or is waiting in the queue to be processed a 202 response code will be returned. You can retry again shortly.
Invalid200
{
    "qaReasons": "",
    "failedJobs": [
        "2017-02-15 17:05:56 - Value Transforms Failed. No values found for field - industry (industry)",
        "2017-02-15 17:05:58 - The lead was submitted for Social Enrichment but no data was found in the past 24 hours.",
        "2017-02-15 17:05:58 - No whitepaper downloads found for this company name."
    ],
    "leadData": {
        "title": "",
        "firstName": "Sarah",
        "lastName": "Simpson",
        "postcode": "",
        "addressLine1": "",
        "addressLine2": "",
        "addressLine3": "",
        "email": "sarah.simpson@yahoo.co.uk",
        "telephone": "",
        "job_title": "Project Manager",
        "industry": "Automotive & Transportation.",
        "company_size": "101 to 500",
        "linkedinUserId": "",
        "companyCountryLookup": "",
        "duns": "",
        "companyCountryCode": "",
        "companyName": "Anderson, Robertson and Murphy",
        "companyAddressLine1": "544 Miller Parkway",
        "companyAddressLine2": "Gordon Brooks",
        "companyCity": "Evansfort",
        "companyCountry": "United Kingdom",
        "companyPostcode": "P2 4RI",
        "companyPhone": "05675 69507",
        "companyUrl": "http://anderson.com/totam-dolor-sint-rerum-veniam-iusto-excepturi-placeat",
        "whitepaperId": "11",
        "whitepaperName": "The Engineering feat of the Helicarrier",
        "campaignWhitepaperRef": "8",
        "whitepaperLocale": "1",
        "emailDomain": "@yahoo.co.uk"
    }
}
If the lead is invalid and belongs to a B2B campaign then you'll receive a response detailing the reasons it was invalidated, along with the associated data submitted.

4.0 Error Responses

Errors will be returns with a status `code` and `message`. Where applicable additional information will be provided in an `errors` array.

Error CodeError BodyDescription
400{"code":400,"message":"Validation Failed","errors":{"errors":["This form should not contain extra fields."],"children":{"firstName":[],"email":[],"lastName":[]}}}Invalid post data, check your request maps to the form fields in section 3.4
401{"error":"invalid_grant","error_description":"The access token provided has expired."}Your access token has expired and you must request a new token, see section 3.2
403{"code":403,"message":"Campaign has not started yet"}The requested campaign hasn't started yet. Enquire with your campaign manager as to when it will be available
403{"code":403,"message":"Campaign is fulfilled"}The requested campaign has already been successfully fulfilled and no more leads are being accepted