Rubygem to interact with the Iterable API.
Source code on Gitlab.
gem install iterable-api-clientor with Bundler in your Gemfile
gem 'iterable-api-client'Documentation can be found on rubydoc or in this README
The Iterable API documentation can be a helpful reference for looking up all the possible endpoint data interactions. The docs outline all the possible parameters to each endpoints as well as custom data fields.
Configure the gem with a default global configuration to use.
Iterable.configure do |config|
config.token = 'api-token'
endIf you have multiple tokens to use you can create a Iterable::Config object
with a different token from the global default and pass in on requests.
# Creating a new config with a different token
conf = Iterable::Config.new(token: 'new-token')
# Example of using it with the campaigns endpoints
# which will then make API requests using the passed in config
campaigns = Iterable::Campaigns.new(config)Response objects will attempt to parse the API response as JSON using the multi_json
gem so you can have your own JSON parser handle the loading of responses.
You can access some of the response data for example:
templates = Iterable::Templates.new
response = templates.all
# Check if the response code is a succesfull HTTP Code from 200-299
response.success?
# Get response code
response.code
# Body of response - will attempt to parse as JSON
response.body
# HTTP message
response.message
# The URI used to make the request for the response
reponse.uri- Bulk Catalog Items
- Campaigns
- Catalog Field Mappings
- Catalog Items
- Catalogs
- Channels
- Commerce
- Device
- Email Templates
- Events
- Experiments
- Export
- In App
- Lists
- Message Types
- Metadata
- Push Templates
- Templates
- Users
- Workflows
Beta access only endpoint
Endpoint: POST /catalogs/{catalogName}/items
catalog = 'my-catalog'
catalog_items = Iterable::BulkCatalogItems.new(catalog)
# Hash of item id to item values
create_items = {
'122343453' => {
name: 'item name',
status: 'open'
}
}
response = catalog_items.create(create_items, replace_uploaded_fields_only: true)
# Use replace_uploaded_fields_only as true to update fields
# of existing items. Otherwise the default is to replace
# existing itemsEndpoint: DELETE /catalogs/{catalogName}/items
catalog = 'my-catalog'
catalog_items = Iterable::BulkCatalogItems.new(catalog)
item_ids = ['12345', '12346', '12347']
response = catalog_items.create(item_ids)Endpoint: GET /campaigns
campaigns = Iterable::Campaigns.new
response = campaigns.allEndpoint: POST /campaigns/create
campaigns = Iterable::Campaigns.new
# List IDs to associate with the campaign
list_ids = [1234, 1235, 1236]
# Additional campaign attributes
attrs = { dataFields: { foo: 'bar' } }
response = campaigns.create 'name', 'template-id', list_ids, attrsEndpoint: GET /campaigns/metrics
campaigns = Iterable::Campaigns.new
campaign_ids = [754321, 4321, 3456]
end_time = Time.now
start_time = end_time - (60 * 60* 24 * 7) # 7 days ago
response = campaigns.metrics campaign_ids, start_time, end_timeEndpoint: GET /campaigns/recurring/{id}/childCampaigns
campaigns = Iterable::Campaigns.new
response = campaigns.recurring 'campaign-id'Beta access only endpoint
Endpoint: POST /catalogs/{catalogName}
catalog = 'my-catalog'
catalogs = Iterable::Catalogs.new(catalog)
response = catalogs.createEndpoint: DELETE /catalogs/{catalogName}
catalog = 'my-catalog'
catalogs = Iterable::Catalogs.new(catalog)
response = catalogs.deleteEndpoint: GET /catalogs/{catalogName}
catalog = 'my-catalog'
catalogs = Iterable::Catalogs.new(catalog)
params = { page: 1, pageSize: 20 }
response = catalogs.names(params)Beta access only endpoint
Endpoint: GET /catalogs/{catalogName}/fieldMappings
catalog = 'my-catalog'
catalog_field_mappings = Iterable::CatalogFieldMappings.new(catalog)
response = catalog_field_mappings.get
response.body['params']['definedMappings']Endpoint: PUT /catalogs/{catalogName}/fieldMappings
catalog = 'my-catalog'
field_mappings = [{fieldName: 'test-field', fieldType: 'string'}]
catalog_field_mappings = Iterable::CatalogFieldMappings.new(catalog)
catalog_field_mappings.update(field_mappings)Beta access only endpoint
Endpoint: GET /catalogs/{catalogName}/items
catalog = 'my-catalog'
catalog_items = Iterable::CatalogItems.new(catalog)
response = catalog_items.allEndpoint: PUT /catalogs/{catalogName}/items/{itemId}
catalog = 'my-catalog'
item_id = '1234-abcd-1234-abcd'
catalog_items = Iterable::CatalogItems.new(catalog, item_id)
item_attrs = { name: 'item name', status: 'open' }
response = catalog_items.create(item_attrs)Endpoint: PATCH /catalogs/{catalogName}/items/{itemId}
catalog = 'my-catalog'
item_id = '1234-abcd-1234-abcd'
catalog_items = Iterable::CatalogItems.new(catalog, item_id)
item_attrs = { name: 'item name', status: 'open' }
response = catalog_items.update(item_attrs)Endpoint: GET /catalogs/{catalogName}/items/{itemId}
catalog = 'my-catalog'
item_id = '1234-abcd-1234-abcd'
catalog_items = Iterable::CatalogItems.new(catalog, item_id)
response = catalog_items.getEndpoint: DELETE /catalogs/{catalogName}/items/{itemId}
catalog = 'my-catalog'
item_id = '1234-abcd-1234-abcd'
catalog_items = Iterable::CatalogItems.new(catalog, item_id)
response = catalog_items.deleteBeta access only endpoint
Endpoint: POST /catalogs/{catalogName}
catalog = 'my-catalog'
catalog_items = Iterable::Catalogs.new(catalog)
response = catalog_items.createEndpoint: DELETE /catalogs/{catalogName}
catalog = 'my-catalog'
catalog_items = Iterable::Catalogs.new(catalog)
response = catalog_items.deleteEndpoint: GET /catalogs/{catalogName}/names
catalog = 'my-catalog'
catalog_items = Iterable::Catalogs.new(catalog)
params = { page: 1, pageSize: 20 }
response = catalog_items.names(params)Endpoint: GET /channels
channels = Iterable::Channels.new
response = channels.allEndpoint: POST /commerce/trackPurchase
# Set up items to track
items = [{
id: 'abcd-1234-hjkl-4321',
name: 'Mustard',
price: 34.0,
quantity: 13
}]
# Calculate total of items i.e. 34.0
total = items.reduce(0) { |total, item| total += item.fetch(:price, 0.0) }
# Gather user information for purchase
user = { userId: '42', email: 'user@example.com' }
commerce = Iterable::Commerce.new
response = commerce.track_purchase total, items, userEndpoint: POST /commerce/updateCart
# Items to update the user's cart with
items = [{
id: 'abcd-1234-hjkl-4321',
name: 'Mustard',
price: 34.0,
quantity: 13
}]
# User of the cart you want to update
user = { userId: '42', email: 'user@example.com' }
commerce = Iterable::Commerce.new
response = commerce.update_cart items, userEndpoint: POST /users/registerDeviceToken
data_fields = { some: 'data', fields: 'here' }
device = Device.new 'token', 'mobile-push-app', Iterable::Device::APNS, data_fields
device.register 'foo@example.com'
# Can pass in a user ID as well
device.register 'user@example.com', '42'Endpoint: GET /email/viewInBrowser
email = Iterable::Email.new
response = email.view 'user@example.com', 'message-id'Endpoint: GET /email/target
email = Iterable::Email.new
# User email and campaign to target
response = email.target 'user@example.com', 42
# Can pass in more attributes like dataFields
response = email.target 'user@example.com', 42, { dataFields: { first_name: 'Sally' } }Endpoint: GET /templates/email/get
templates = Iterable::EmailTemplates.new
response = templates.get 'template-id'Endpoint: POST /templates/email/update
templates = Iterable::EmailTemplates.new
# Additional template attributes
attrs = { metadata: {}, name: 'name', fromEmail: 'co@co.co' }
response = templates.update 'template-id', attrsEndpoint: POST /templates/email/update
templates = Iterable::EmailTemplates.new
# Additional template attributes
attrs = { metadata: {}, name: 'name', fromEmail: 'co@co.co' }
response = templates.upsert 'client-template-id', attrsEndpoint: GET /events/{email}
events = Iterable::Events.new
# Default limit of 30
response = events.for_email 'user@example.com'Endpoint: POST /events/track
events = Iterable::Events.new
# Any aditional attributes for the event
attrs = { campaignId: 42, dataFields: {} }
response = events.track 'event-name', 'user@example.com', attrsEndpoint: GET /events/{email}
events = Iterable::Events.new
response = events.for_email 'user@example.com'
campaign_id = 42
message_id = 123
# Any aditional attributes for the event
attrs = { dataFields: {} }
response = events.track_push_open campaign_id, message_id, 'user@example.com', attrsEndpoint: GET /experiments/metrics
experiment_ids = [1, 2, 3, 4]
experiments = Iterable::Experiments.new experiment_ids
end_time = Time.now
start_time = end_time - (60 * 60* 24 * 7) # 7 days ago
response = experiments.metrics campaign_ids, start_time, end_timeEndpoint: GET /export/data.json
exporter = Iterable::JsonExporter.new Iterable::Export::EMAIL_SEND_TYPE
# Export with an iterable range
response = exporter.export_range Iterable::Export::BEFORE_TODAY
# Export with a custom time range
end_time = Time.now
start_time = end_time - (60 * 60* 24 * 7) # 7 days ago
response = exporter.export start_time, end_timeEndpoint: GET /export/data.csv
exporter = Iterable::CsvExporter.new Iterable::Export::EMAIL_SEND_TYPE
# Export with an iterable range
response = exporter.export_range Iterable::Export::BEFORE_TODAY
# Export with a custom time range
end_time = Time.now
start_time = end_time - (60 * 60* 24 * 7) # 7 days ago
response = exporter.export start_time, end_timeEndpoint: GET /inApp/getMessages
in_app = Iterable::InApp.new
# Get messages for a user by email
email = 'user@example.com'
response = in_app.messages_for_email email, count: 10
# Get messages for a user by user_id
email = 'user@example.com'
response = in_app.messages_for_user_id 42, count: 2
# Pass in query parameters
email = 'user@example.com'
attrs = { 'platform' => 'iOS' }
response = in_app.messages_for_email: email, attrsEndpoint: GET /lists
lists = Iterable::Lists.new
response = lists.allEndpoint: POST /lists
lists = Iterable::Lists.new
response = lists.create 'list-name'Endpoint: DELETE /lists/{listId}
lists = Iterable::Lists.new
response = lists.delete 'list-id'Endpoint: GET /lists/getUsers
lists = Iterable::Lists.new
response = lists.users 'list-id'Endpoint: POST /lists/subscribe
lists = Iterable::Lists.new
subscribers = [
{ email: 'user@example.com', dataFields: {}, userId: '42' }
]
response = lists.subscribe 'list-id', subscribersEndpoint: POST /lists/unsubscribe
lists = Iterable::Lists.new
subscribers = [
{ email: 'user@example.com', dataFields: {}, userId: '42' }
]
response = lists.unsubscribe 'list-id', subscribersEndpoint: GET /messageTypes
metadata = Iterable::MessageTypes.new
response = metadata.allEndpoint: GET /metadata
metadata = Iterable::Metadata.new
response = metadata.getEndpoint: GET /metadata/{table}
metadata_table = Iterable::MetadataTable.new 'table-name'
response = metadata_table.list_keys
# Next marker is thenext result set id which is returned by previous
# search if more hits exist
response = metadata_table.list_keys 'next-marker-id'Endpoint: DELETE /metadata/{table}
metadata_table = Iterable::MetadataTable.new 'table-name'
response = metadata_table.deleteEndpoint: GET /metadata/{table}/{key}
metadata_table = Iterable::MetadataTable.new 'table-name'
response = metadata_table.get 'metadata-key'Endpoint: DELETE /metadata/{table}/{key}
metadata_table = Iterable::MetadataTable.new 'table-name'
response = metadata_table.remove 'metadata-key'Endpoint: PUT /metadata/{table}/{key}
metadata_table = Iterable::MetadataTable.new 'table-name'
value = { foo: 'bar', data: 'stuffs' }
response = metadata_table.add 'metadata-key', valueEndpoint: GET /templates/push/get
templates = Iterable::PushTemplates.new
# Additional template params to query by
params = { locale: 'en-US' }
response = templates.get 'template-id', paramsEndpoint: POST /templates/push/update
templates = Iterable::PushTemplates.new
# Additional template attrs to update
attrs = { name: 'Template', message: 'Template message'}
response = templates.update 'client-template-id', attrsEndpoint: POST /templates/push/upsert
templates = Iterable::PushTemplates.new
# Additional template attrs to upsert
attrs = { name: 'Template', message: 'Template message'}
response = templates.upsert 'client-template-id', attrsEndpoint: GET /templates
templates = Iterable::Templates.new
# Additional params to filter and search by
params = { templateType: Iterable::Templates::BLAST_TYPE, messageMedium: Iterable::MessageTypes::EMAIL_MEDIUM }
response = templates.all paramsEndpoint: GET /templates/getByClientTemplateId
templates = Iterable::Templates.new
response = templates.for_client_template_id 'client-template-id'Endpoint: POST /users/update
users = Iterable::Users.new
# Additional attributes to send
attrs = { userID: 'custom-id' }
response = users.update 'user@example.com', attrsEndpoint: POST /users/bulkUpdate
users = Iterable::Users.new
# Array of users to update by email with additional
# fields if needed
users = [
{ email: 'user@example.com', userID: 'custom-id' }
]
response = users.bulk_update usersEndpoint: POST /users/updateSubscriptions
users = Iterable::Users.new
# Additional attributes to send
attrs = { userID: 'custom-id' }
response = users.update_subscriptions 'user@example.com', attrsEndpoint: POST /users/bulkUpdateSubscriptions
users = Iterable::Users.new
# Array of users to update by email with additional
# fields if needed
users = [
{ email: 'user@example.com', userID: 'custom-id' }
]
response = users.bulk_update_subscriptions usersEndpoint: GET /users/{email}
users = Iterable::Users.new
response = users.for_email 'user@example.com'Endpoint: GET /users/byUserID/{userID}
users = Iterable::Users.new
response = users.for_id '42'Endpoint: GET /users/getFields
users = Iterable::Users.new
response = users.fieldsEndpoint: POST /users/updateEmail
users = Iterable::Users.new
response = users.update_email 'old-email@me.com', 'new-email@email.me'Endpoint: DELETE /users/{email}
users = Iterable::Users.new
response = users.delete 'user@example.com'Endpoint: DELETE /users/byUserId/{userID}
users = Iterable::Users.new
response = users.delete_by_id '42'Endpoint: POST /users/registerBrowserToken
users = Iterable::Users.new
# Additional attrs to associate with token
attrs = { userID: '42' }
response = users.register_browser_token 'user@example.com', 'the-token', attrsEndpoint: POST /users/registerBrowserToken
users = Iterable::Users.new
response = users.disable_device 'the-token', 'user@example.com'
# Optionally can use a user ID over email
response = users.disable_device 'the-token', nil, '42'Endpoint: POST /users/update
users = Iterable::Users.new
# Additional params to filter and query by
params = { campaignId: 'custom-id', limit: 30 }
end_time = Time.now
start_time = end_time - (60 * 60* 24 * 7) # 7 days ago
response = users.sent_messages 'user@example.com', start_time, end_time, paramsEndpoint: POST /users/forget
users = Iterable::Users.new
# Additional params to filter and query by
email = 'user@example.com'
response = users.forget emailEndpoint: POST /workflows/triggerWorkflow
workflows = Iterable::Workflows.new
# Additional attributes to send
attrs = { listId: 'listId' }
response = workflows.trigger 'workflow-id', attrs