Accepts an array of custom objects to be created or updated, up to a maximum of 100 per call, and returns the outcome (status) of the operation (CREATED, UPDATED, FAILED, UNCHANGED, SKIPPED) and the custom object(s) that were processed. The API can be called in one of three operation modes:
- INSERT – only insert new objects, skip existing objects
- UPDATE – only update existing objects, skip new objects
- UPSERT – insert new objects and update existing objects
In a single API call some updates may succeed and some may fail. An error message will be returned for each failure.
For Custom Objects provisioned with the new Custom Object UI, only fields which are designated as dedupe fields in the UI may be passed as attributes in CustomObjKeyList. Link fields which are not dedupe fields must be passed as an attribute in customObjAttributeList.
Request
Field Name |
Required/Optional |
Description |
---|---|---|
operation | Required | “INSERT”, “UPDATE” or “UPSERT” |
objectTypeName | Required | Name of the Custom Object |
customObjectList->customObject->customObjKeyList->attribute | Required | The attribute is a key/value pair that is used to identify the custom object. You can have multiple attributes in the customObjKeyList |
customObjectList->customObject->customObjAttributeList->attribute | Required | Key/value pairs, where the name is the field name and value is the value that you want to insert into the customObject |
Request XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.marketo.com/mktows/"> <SOAP-ENV:Header> <ns1:AuthenticationHeader> <mktowsUserId>demo17_1_809934544BFABAE58E5D27</mktowsUserId> <requestSignature>ca67d597ced5bfce7f638e96204d6e1f38d3ffe7</requestSignature> <requestTimestamp>2013-08-20T10:26:07-07:00</requestTimestamp> </ns1:AuthenticationHeader> </SOAP-ENV:Header> <SOAP-ENV:Body> <ns1:paramsSyncCustomObjects> <objTypeName>RoadShow</objTypeName> <customObjList> <customObj> <customObjKeyList> <attribute> <attrName>MKTOID</attrName> <attrValue>1090177</attrValue> </attribute> <attribute> <attrName>rid</attrName> <attrValue>rid1</attrValue> </attribute> </customObjKeyList> <customObjAttributeList> <attribute> <attrName>city</attrName> <attrValue>SanMateo</attrValue> </attribute> <attribute> <attrName>zip</attrName> <attrValue>94404</attrValue> </attribute> <attribute> <attrName>state</attrName> <attrValue>California</attrValue> </attribute> </customObjAttributeList> </customObj> </customObjList> <operation>UPSERT</operation> </ns1:paramsSyncCustomObjects> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
Response XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://www.marketo.com/mktows/"> <SOAP-ENV:Body> <ns1:successSyncCustomObjects> <result> <syncCustomObjStatusList> <syncCustomObjStatus> <objTypeName>Roadshow</objTypeName> <customObjKeyList> <attribute> <attrName>MKTOID</attrName> <attrType xsi:nil="true" /> <attrValue>1090177</attrValue> </attribute> <attribute> <attrName>rid</attrName> <attrType xsi:nil="true" /> <attrValue>rid1</attrValue> </attribute> </customObjKeyList> <status>UPDATED</status> <error xsi:nil="true" /> </syncCustomObjStatus> </syncCustomObjStatusList> </result> </ns1:successSyncCustomObjects> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
Sample Code – PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
<?php $debug = true; $marketoSoapEndPoint = ""; // CHANGE ME $marketoUserId = ""; // CHANGE ME $marketoSecretKey = ""; // CHANGE ME $marketoNameSpace = "http://www.marketo.com/mktows/"; // Create Signature $dtzObj = new DateTimeZone("America/Los_Angeles"); $dtObj = new DateTime('now', $dtzObj); $timeStamp = $dtObj->format(DATE_W3C); $encryptString = $timeStamp . $marketoUserId; $signature = hash_hmac('sha1', $encryptString, $marketoSecretKey); // Create SOAP Header $attrs = new stdClass(); $attrs->mktowsUserId = $marketoUserId; $attrs->requestSignature = $signature; $attrs->requestTimestamp = $timeStamp; $authHdr = new SoapHeader($marketoNameSpace, 'AuthenticationHeader', $attrs); $options = array("connection_timeout" => 15, "location" => $marketoSoapEndPoint); if ($debug) { $options["trace"] = 1; } // Create Request $keyAttrib1 = new stdClass(); $keyAttrib1->attrName = 'MKTOID'; $keyAttrib1->attrValue = '1090177'; $keyAttrib2 = new stdClass(); $keyAttrib2->attrName = 'rid'; $keyAttrib2->attrValue ='rid1'; $keyAttrList = array($keyAttrib1, $keyAttrib2); $keyList = new stdClass(); $keyList->attribute = $keyAttrList; $attr1 = new stdClass(); $attr1->attrName = 'city'; $attr1->attrValue = 'SanMateo'; $attr2 = new stdClass(); $attr2->attrName = 'zip'; $attr2->attrValue = '94404'; $attr3 = new stdClass(); $attr3->attrName = 'state'; $attr3->attrValue = 'California'; $attrListArray = array($attr1, $attr2, $attr3); $attrList = new stdClass(); $attrList->attribute = $attrListArray; $custObj = new stdClass(); $custObj->customObjKeyList = $keyList; $custObj->customObjAttributeList = $attrList; $custObjList = new stdClass(); $custObjList->customObj = array($custObj); $params = new stdClass(); $params->operation = 'UPSERT'; $params->objTypeName = 'RoadShow'; $params->customObjList = $custObjList; $soapClient = new SoapClient($marketoSoapEndPoint ."?WSDL", $options); try { $leads = $soapClient->__soapCall('syncCustomObjects', array($params), $options, $authHdr); // print_r($leads); } catch(Exception $ex) { var_dump($ex); } if ($debug) { print "RAW request:\n" .$soapClient->__getLastRequest() ."\n"; print "RAW response:\n" .$soapClient->__getLastResponse() ."\n"; } ?> |
Sample Code – Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
import com.marketo.mktows.*; import java.net.URL; import javax.xml.namespace.QName; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Hex; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Marshaller; public class SyncCustomObjects { public static void main(String[] args) { System.out.println("Executing Sync Custom Objects"); try { URL marketoSoapEndPoint = new URL("CHANGE ME" + "?WSDL"); String marketoUserId = "CHANGE ME"; String marketoSecretKey = "CHANGE ME"; QName serviceName = new QName("http://www.marketo.com/mktows/", "MktMktowsApiService"); MktMktowsApiService service = new MktMktowsApiService(marketoSoapEndPoint, serviceName); MktowsPort port = service.getMktowsApiSoapPort(); // Create Signature DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); String text = df.format(new Date()); String requestTimestamp = text.substring(0, 22) + ":" + text.substring(22); String encryptString = requestTimestamp + marketoUserId ; SecretKeySpec secretKey = new SecretKeySpec(marketoSecretKey.getBytes(), "HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1"); mac.init(secretKey); byte[] rawHmac = mac.doFinal(encryptString.getBytes()); char[] hexChars = Hex.encodeHex(rawHmac); String signature = new String(hexChars); // Set Authentication Header AuthenticationHeader header = new AuthenticationHeader(); header.setMktowsUserId(marketoUserId); header.setRequestTimestamp(requestTimestamp); header.setRequestSignature(signature); // Create Request ParamsSyncCustomObjects request = new ParamsSyncCustomObjects(); request.setObjTypeName("RoadShow"); JAXBElement<SyncOperationEnum> operation = new ObjectFactory().createParamsSyncCustomObjectsOperation(SyncOperationEnum.UPSERT); request.setOperation(operation); ArrayOfCustomObj customObjects = new ArrayOfCustomObj(); CustomObj customObj = new CustomObj(); ArrayOfAttribute arrayOfKeyAttributes = new ArrayOfAttribute(); Attribute attr = new Attribute(); attr.setAttrName("MKTOID"); attr.setAttrValue("1090177"); Attribute attr2 = new Attribute(); attr2.setAttrName("rid"); attr2.setAttrValue("rid1"); arrayOfKeyAttributes.getAttributes().add(attr); arrayOfKeyAttributes.getAttributes().add(attr2); JAXBElement<ArrayOfAttribute> keyAttributes = new ObjectFactory().createCustomObjCustomObjKeyList(arrayOfKeyAttributes); customObj.setCustomObjKeyList(keyAttributes); ArrayOfAttribute arrayOfValueAttributes = new ArrayOfAttribute(); Attribute city = new Attribute(); city.setAttrName("city"); city.setAttrValue("SanMateo"); Attribute zip = new Attribute(); zip.setAttrName("zip"); zip.setAttrValue("94404"); Attribute state = new Attribute(); state.setAttrName("state"); state.setAttrValue("California"); arrayOfValueAttributes.getAttributes().add(city); arrayOfValueAttributes.getAttributes().add(state); arrayOfValueAttributes.getAttributes().add(zip); JAXBElement<ArrayOfAttribute> valueAttributes = new ObjectFactory().createCustomObjCustomObjAttributeList(arrayOfValueAttributes); customObj.setCustomObjAttributeList(valueAttributes); customObjects.getCustomObjs().add(customObj); SuccessSyncCustomObjects result = port.syncCustomObjects(request, header); JAXBContext context = JAXBContext.newInstance(SuccessSyncCustomObjects.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); m.marshal(result, System.out); } catch(Exception e) { e.printStackTrace(); } } } |
Sample Code – Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
require 'savon' # Use version 2.0 Savon gem require 'date' mktowsUserId = "" # CHANGE ME marketoSecretKey = "" # CHANGE ME marketoSoapEndPoint = "" # CHANGE ME marketoNameSpace = "http://www.marketo.com/mktows/" #Create Signature Timestamp = DateTime.now requestTimestamp = Timestamp.to_s encryptString = requestTimestamp + mktowsUserId digest = OpenSSL::Digest.new('sha1') hashedsignature = OpenSSL::HMAC.hexdigest(digest, marketoSecretKey, encryptString) requestSignature = hashedsignature.to_s #Create SOAP Header headers = { 'ns1:AuthenticationHeader' => { "mktowsUserId" => mktowsUserId, "requestSignature" => requestSignature, "requestTimestamp" => requestTimestamp } } client = Savon.client(wsdl: 'http://app.marketo.com/soap/mktows/2_3?WSDL', soap_header: headers, endpoint: marketoSoapEndPoint, namespaces: namespaces, open_timeout: 90, read_timeout: 90, namespace_identifier: :ns1, env_namespace: 'SOAP-ENV') #Create Request request = { :obj_type_name => "RoadShow", :custom_obj_list => { :custom_obj => { :custom_obj_key_list => { :attribute => { :attr_name => "MKTOID", :attr_value => "1090177" }, :attribute! => { :attr_name => "rid", :attr_value => "rid1" } }, :custom_obj_attribute_list => { :attribute => { :attr_name => "city", :attr_value => "SanMateo" }, :attribute! => { :attr_name => "zip", :attr_value => "94404" }, :attribute! => { :attr_name => "state", :attr_value => "California" } } } }, :operation => "UPSERT" } response = client.call(:sync_custom_objects, message: request) puts response |