{"id":1602,"date":"2017-07-25T03:02:24","date_gmt":"2017-07-25T03:02:24","guid":{"rendered":"http:\/\/zappysys.com\/blog\/?p=1602"},"modified":"2025-03-31T13:44:42","modified_gmt":"2025-03-31T13:44:42","slug":"reading-loading-data-in-xero-sql-server-ssis","status":"publish","type":"post","link":"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/","title":{"rendered":"How to read\/load data in Xero using SSIS"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p><a href=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-1621\" src=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration.png\" alt=\"\" width=\"120\" height=\"120\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration.png 375w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration-150x150.png 150w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration-300x300.png 300w\" sizes=\"(max-width: 120px) 100vw, 120px\" \/><\/a>Xero is well known Cloud based Accounting Software. In this post you will learn how to implement <a href=\"https:\/\/developer.xero.com\/documentation\/getting-started\/getting-started-guide\" target=\"_blank\" rel=\"noopener\">Xero API<\/a> Integration with SQL Server or any other RDBMS (e.g. Oracle, MySQL, Postgresql) using <strong>SSIS<\/strong> in few clicks. We will use <a href=\"\/\/zappysys.com\/products\/ssis-powerpack\/ssis-json-file-source\/\" target=\"_blank\" rel=\"noopener\">SSIS JSON Source<\/a> to <strong>Read data from Xero<\/strong> and Load into SQL Server \/ other target (Using OAuth Connection). We will also discuss reverse scenario to <strong>Write data to Xero<\/strong> (API POST for Insert or Update in Xero) using <a href=\"\/\/zappysys.com\/products\/ssis-powerpack\/ssis-web-api-destination-connector\/\" target=\"_blank\" rel=\"noopener\">SSIS Web API Destination<\/a> and <a href=\"\/\/zappysys.com\/products\/ssis-powerpack\/ssis-json-generator-transform\/\" target=\"_blank\" rel=\"noopener\">SSIS JSON Generator Transform<\/a><\/p>\n<h2><\/h2>\n<h2><span id=\"Prerequisites\">Prerequisites<\/span><\/h2>\n<p>Before we look into Step-By-Step section to extract and load data from <strong>Xero to SQL Server<\/strong> let\u2019s make sure you met following requirements.<\/p>\n<ol>\n<li>SSIS designer installed.\u00a0Sometimes it is referred as BIDS or SSDT (<a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/ssdt\/download-sql-server-data-tools-ssdt\" target=\"_blank\" rel=\"noopener\">download it from Microsoft site<\/a>).<\/li>\n<li>Basic knowledge of SSIS package\u00a0development using\u00a0<em>Microsoft SQL Server Integration Services<\/em>.<\/li>\n<li><a href=\"\/\/zappysys.com\/products\/ssis-powerpack\/\" target=\"_blank\" rel=\"noopener\"><em>ZappySys SSIS PowerPack<\/em>\u00a0installed<\/a>. Click on the link to download FREE trial.<\/li>\n<li>You have basic familiarity with REST API concepts and Xero API.<\/li>\n<\/ol>\n<h2>Concepts of Xero REST API<\/h2>\n<h3>API Authorization<\/h3>\n<p>Before you can access Xero API you must register account and App. There are 3 types of Apps to access Xero API.<\/p>\n<ol>\n<li>Private App (X509 Certificate used to sign requests)<\/li>\n<li>Public App (Use 3-legged OAuth. Token expires in 30 mins and then you have to authorize again from UI)<\/li>\n<li>Partner App (Use 3-legged OAuth. Token expires in 30 mins.. but refresh token supported to get new token for unlimited times without Authorization via Login UI)<\/li>\n<li><a href=\"https:\/\/developer.xero.com\/documentation\/oauth2\/auth-flow\" target=\"_blank\" rel=\"noopener\">OAuth2.0 Authentication\u00a0(Recommended)\u00a0<\/a><\/li>\n<\/ol>\n<p>In this article we will use <a href=\"https:\/\/developer.xero.com\/documentation\/auth-and-limits\/private-applications\" target=\"_blank\" rel=\"noopener\">Private App<\/a> to access your company data in Xero.<\/p>\n<h3>Data formats<\/h3>\n<p>Xero API supports Xml and JSON both formats over the same URL (endpoints). If you want data in JSON format then you have to pass following Header (else data in Xml format will be returned). If you are using <a href=\"\/\/zappysys.com\/products\/ssis-powerpack\/ssis-json-file-source\/\" target=\"_blank\" rel=\"noopener\">SSIS JSON Source<\/a> then make sure following header is added. For <a href=\"\/\/zappysys.com\/products\/ssis-powerpack\/ssis-xml-source\/\" target=\"_blank\" rel=\"noopener\">SSIS XML Source<\/a> no need to add this header.<\/p>\n<pre class=\"\">Accept : application\/json<\/pre>\n<h2>Step-By-Step : Xero API Integration in SSIS<\/h2>\n<p>Now lets look at steps needed to fetch data from Xero and load into SQL Server.<\/p>\n<h3><span id=\"Configure_OAuth_Connection_for_Google_BigQuery_API\">Configure OAuth2.0 Connection for Xero API\u00a0(Recommended)<\/span><\/h3>\n<p>So let&#8217;s how to create the Xero OAuth2.0 connection. For more on OAuth2.0 refer to <a href=\"https:\/\/zappysys.com\/blog\/rest-api-authentication-with-oauth-2-0-using-ssis\/\" target=\"_blank\" rel=\"noopener\">this article<\/a>.<\/p>\n<ol>\n<li>Right-click inside the Connection Managers area again and click \u201cNew Connection\u2026\u201d<\/li>\n<li>From the connection type list select \u201cZS-OAUTH\u201d connection type.\n<div id=\"attachment_1569\" style=\"width: 687px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-create-new-connection.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1569\" class=\"wp-image-1569 size-full\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-create-new-connection.png\" alt=\"Create new SSIS OAuth API Connection Manager\" width=\"677\" height=\"220\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-create-new-connection.png 677w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-create-new-connection-300x97.png 300w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/><\/a><p id=\"caption-attachment-1569\" class=\"wp-caption-text\">Create new SSIS OAuth API Connection Manager<\/p><\/div><\/li>\n<li>Select<em>\u00a0OAuth Provider\u00a0<\/em>which Custom, enter the CleintID and Secret and set the URLs as below and desired <a href=\"https:\/\/developer.xero.com\/documentation\/oauth2\/scopes\" target=\"_blank\" rel=\"noopener\">scopes<\/a>\u00a0that are required for the API Call.<br \/>\nAuth URL:<\/p>\n<pre class=\"lang:default decode:true\">https:\/\/login.xero.com\/identity\/connect\/authorize<\/pre>\n<p>Token URL:<\/p>\n<pre class=\"lang:default decode:true\">https:\/\/identity.xero.com\/connect\/token<\/pre>\n<p>Scopes: Add your desired scopes based on your API call requirements.<br \/>\n<div class=\"su-note\"  style=\"border-color:#e5de9d;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\"><div class=\"su-note-inner su-u-clearfix su-u-trim\" style=\"background-color:#fff8b7;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\">Note: To get a refresh token, you must request the offline_access scope. A refresh token allows you to refresh your access token and maintain an offline connection.<br \/>\n<strong>offline_access<\/strong><\/p>\n<p><a href=\"https:\/\/developer.xero.com\/documentation\/guides\/oauth2\/scopes\/#offline-access\" target=\"_blank\" rel=\"noopener\">https:\/\/developer.xero.com\/documentation\/guides\/oauth2\/scopes\/#offline-access<\/a><\/div><\/div>\n<div id=\"attachment_8858\" style=\"width: 681px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-oauth2.0-connection-configuration.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8858\" class=\"wp-image-8858 size-full\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-oauth2.0-connection-configuration.png\" alt=\"OAuth2.0 Connection\" width=\"671\" height=\"695\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-oauth2.0-connection-configuration.png 671w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-oauth2.0-connection-configuration-290x300.png 290w\" sizes=\"(max-width: 671px) 100vw, 671px\" \/><\/a><p id=\"caption-attachment-8858\" class=\"wp-caption-text\">OAuth2.0 Connection<\/p><\/div><\/li>\n<li>\u00a0Now go to the Advanced tab and set the redirect URL as below and also you need to set the same URL in the Xero API App.\n<pre class=\"lang:default decode:true \">https:\/\/zappysys.com\/oauth2<\/pre>\n<div id=\"attachment_1345\" style=\"width: 581px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/06\/ssis-oauth-setting-redirect-url1.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1345\" class=\"wp-image-1345 size-full\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/06\/ssis-oauth-setting-redirect-url1.png\" alt=\"\" width=\"571\" height=\"123\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/06\/ssis-oauth-setting-redirect-url1.png 571w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/06\/ssis-oauth-setting-redirect-url1-300x65.png 300w\" sizes=\"(max-width: 571px) 100vw, 571px\" \/><\/a><p id=\"caption-attachment-1345\" class=\"wp-caption-text\">Set Callback\/Return Url in OAuth Connection<\/p><\/div><\/li>\n<li>Now Click on the Generate Token Button and logged in with Xero username and password and grant permission.<\/li>\n<li>That&#8217;s it your token is generated. If you got the blank Screen like this after following all the steps. Close that window.\n<div id=\"attachment_8859\" style=\"width: 671px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-oauth2.0-connection-blank-screen.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8859\" class=\"wp-image-8859 size-full\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-oauth2.0-connection-blank-screen.png\" alt=\"OAuth2.0 connection : Blank Window at last\" width=\"661\" height=\"653\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-oauth2.0-connection-blank-screen.png 661w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-oauth2.0-connection-blank-screen-300x296.png 300w\" sizes=\"(max-width: 661px) 100vw, 661px\" \/><\/a><p id=\"caption-attachment-8859\" class=\"wp-caption-text\">OAuth2.0 connection : Blank Window at last<\/p><\/div><\/li>\n<li>And it will ask you to use the\u00a0Different Method to generate the Token using system default browser <strong>click on YES<\/strong>.\n<div id=\"attachment_8860\" style=\"width: 671px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-connection-default-browser-to-generate-toekn.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8860\" class=\"size-full wp-image-8860\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-connection-default-browser-to-generate-toekn.png\" alt=\"Different Method to generate the Token using system default browser\" width=\"661\" height=\"653\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-connection-default-browser-to-generate-toekn.png 661w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-connection-default-browser-to-generate-toekn-300x296.png 300w\" sizes=\"(max-width: 661px) 100vw, 661px\" \/><\/a><p id=\"caption-attachment-8860\" class=\"wp-caption-text\">Different Method to generate the Token using system default browser<\/p><\/div><\/li>\n<li>It will open the URL in the browser there you need to log in and grant the permission.<\/li>\n<li>After that, you will able to view the access token in the browser. you can copy from there also.\n<div id=\"attachment_8861\" style=\"width: 738px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-default-browser-generated-token.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8861\" class=\"wp-image-8861 size-full\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-default-browser-generated-token.png\" alt=\"Generated Token\" width=\"728\" height=\"347\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-default-browser-generated-token.png 728w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-default-browser-generated-token-300x143.png 300w\" sizes=\"(max-width: 728px) 100vw, 728px\" \/><\/a><p id=\"caption-attachment-8861\" class=\"wp-caption-text\">Generated Token<\/p><\/div><\/li>\n<li>At the last, it will again focus on the connection and there it will ask you to save the token if you want to store it. if not then you can manually copy and paste that token.\n<div id=\"attachment_8862\" style=\"width: 671px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-popup-to-store-token.png\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8862\" class=\"wp-image-8862 size-full\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-popup-to-store-token.png\" alt=\"OAuth Connection : Store the Tokens\" width=\"661\" height=\"653\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-popup-to-store-token.png 661w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-popup-to-store-token-300x296.png 300w\" sizes=\"(max-width: 661px) 100vw, 661px\" \/><\/a><p id=\"caption-attachment-8862\" class=\"wp-caption-text\">OAuth Connection : Store the Tokens<\/p><\/div><\/li>\n<li>That&#8217;s it now click on the Test Connection button to test it.\n<div id=\"attachment_6415\" style=\"width: 730px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2019\/01\/odbc-quickbooks-oauth-test.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-6415\" class=\"size-medium_large wp-image-6415\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2019\/01\/odbc-quickbooks-oauth-test-768x735.png\" alt=\"\" width=\"720\" height=\"689\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2019\/01\/odbc-quickbooks-oauth-test-768x735.png 768w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2019\/01\/odbc-quickbooks-oauth-test-300x287.png 300w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2019\/01\/odbc-quickbooks-oauth-test.png 771w\" sizes=\"(max-width: 720px) 100vw, 720px\" \/><\/a><p id=\"caption-attachment-6415\" class=\"wp-caption-text\">Generate Token and Test Connection<\/p><\/div><\/li>\n<\/ol>\n<h3>Register OAuth App Private for\u00a0Xero (Private App) OAuth Connection (Depreciated)<\/h3>\n<p>Here is how to configure Xero to use Private App (click on below link).<\/p>\n<p><a href=\"https:\/\/developer.xero.com\/documentation\/auth-and-limits\/private-applications\" target=\"_blank\" rel=\"noopener\">https:\/\/developer.xero.com\/documentation\/auth-and-limits\/private-applications<\/a><\/p>\n<p>In the above link during <a href=\"https:\/\/developer.xero.com\/documentation\/api-guides\/create-publicprivate-key\" target=\"_blank\" rel=\"noopener\">these steps<\/a>\u00a0<strong>openssl<\/strong> command may throw error about <strong>openssl.cnf is missing<\/strong> or cannot load. If you face such error then don&#8217;t worry just refer to following workaround.<\/p>\n<p><a href=\"https:\/\/stackoverflow.com\/questions\/14459078\/unable-to-load-config-info-from-usr-local-ssl-openssl-cnf\" target=\"_blank\" rel=\"noopener\">https:\/\/stackoverflow.com\/questions\/14459078\/unable-to-load-config-info-from-usr-local-ssl-openssl-cnf<\/a><\/p>\n<p>Basically you can either supply config file path in each command OR set path by issuing SET command before any other command. See below examples (Assuming you installed OpenSSL to c:\\OpenSSL-Win64 folder)<\/p>\n<pre><code>c:\\OpenSSL-Win64&gt;openssl req -x509 -config \"C:\\OpenSSL-Win64\\bin\\openssl.cnf\"<\/code><\/pre>\n<p>&#8212; OR &#8212; \u00a0type before command before any other openssl commands<\/p>\n<pre class=\"\">c:\\OpenSSL-Win64&gt;set OPENSSL_CONF=c:\\OpenSSL-Win64\\bin\\openssl.cnf\r\n\r\nc:\\OpenSSL-Win64&gt;openssl req -x509 -config \"C:\\OpenSSL-Win64\\bin\\openssl.cnf\"<\/pre>\n<p>Once you generate public key, private key and, pfx file we are ready to <strong>call Xero API in SSIS<\/strong><\/p>\n<h4><span id=\"Configure_OAuth_Connection_for_Google_BigQuery_API\">Configure Xero (Private App) OAuth Connection<\/span><\/h4>\n<p>Once you generate certificate using openssl and register Private App for Xero we are ready to move to SSIS piece. Lets see how to do that.<\/p>\n<ol>\n<li>Open Visual Studio<\/li>\n<li>Open existing SSIS Project or create new using File &gt; New &gt; Project &gt; Choose &#8220;Integration Services Project&#8221; Type under Business Intelligence template category<\/li>\n<li>Open Package<\/li>\n<li>Right click inside Connection Managers area and click \u201cNew Connection\u2026\u201d<\/li>\n<li>From the connection type list select \u201cZS-OAUTH\u201d connection type.\n<div id=\"attachment_1569\" class=\"wp-caption alignnone\">\n<p><a href=\"https:\/\/i0.wp.com\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-create-new-connection.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1569\" style=\"border: 0px; max-width: 100%; height: auto; box-shadow: rgba(0, 0, 0, 0.176) 0px 1px 2px;\" src=\"https:\/\/i0.wp.com\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-create-new-connection.png?resize=677%2C220\" sizes=\"(max-width: 677px) 100vw, 677px\" srcset=\"https:\/\/i0.wp.com\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-create-new-connection.png?w=677 677w, https:\/\/i0.wp.com\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-create-new-connection.png?resize=300%2C97 300w\" alt=\"Create new SSIS OAuth API Connection Manager\" width=\"643\" height=\"209\" data-attachment-id=\"1569\" data-permalink=\"https:\/\/zappysys.com\/blog\/get-data-google-bigquery-using-ssis\/ssis-oauth-create-new-connection\/#main\" data-orig-file=\"https:\/\/i0.wp.com\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-create-new-connection.png?fit=677%2C220&amp;ssl=1\" data-orig-size=\"677,220\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"ssis-oauth-create-new-connection\" data-image-description=\"&lt;p&gt;Create new SSIS OAuth API Connection Manager&lt;\/p&gt; \" data-medium-file=\"https:\/\/i0.wp.com\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-create-new-connection.png?fit=300%2C97&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-create-new-connection.png?fit=677%2C220&amp;ssl=1\" \/><\/a><\/p>\n<p class=\"wp-caption-text\">Create new SSIS OAuth API Connection Manager<\/p>\n<\/div>\n<\/li>\n<li>On the connection select \u201cXero (Private App)\u201d from Service Provider Dropdown<\/li>\n<li>Enter Client ID (Obtain this from <a href=\"https:\/\/app.xero.com\/Application\/\" target=\"_blank\" rel=\"noopener\">App created<\/a> in Previous section) App Selection leave \u201cUse Default OAuth App\u201d selected. If you\u00a0<a href=\"\/\/zappysys.com\/blog\/register-google-oauth-application-get-clientid-clientsecret\/\" target=\"_blank\" rel=\"noopener\">created custom OAuth App<\/a>\u00a0then select \u201cUse Custom OAuth App\u201d Option<\/li>\n<li>Enter some fake value in Client Secret (not needed when you use Private App). Secret will come from certificate file like below.\n<div id=\"attachment_1612\" style=\"width: 685px\" class=\"wp-caption alignnone\"><a href=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-connection-for-xero-private-app-x509-certificate.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1612\" class=\"size-full wp-image-1612\" src=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-connection-for-xero-private-app-x509-certificate.png\" alt=\"SSIS OAuth Connection - Configure Xero API Connectivity using Private App (Certificate File Approach)\" width=\"675\" height=\"512\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-connection-for-xero-private-app-x509-certificate.png 675w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-connection-for-xero-private-app-x509-certificate-300x228.png 300w\" sizes=\"(max-width: 675px) 100vw, 675px\" \/><\/a><p id=\"caption-attachment-1612\" class=\"wp-caption-text\">SSIS OAuth Connection &#8211; Configure Xero API Connectivity using Private App (Certificate File Approach)<\/p><\/div><\/li>\n<li>Now go to Certificate tab and Check Use Certificate Enter, Enter certificate location and password like below.\n<div id=\"attachment_1611\" style=\"width: 685px\" class=\"wp-caption alignnone\"><a href=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-xero-x509-certificate-public-private-key-example-pfx-file.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1611\" class=\"size-full wp-image-1611\" src=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-xero-x509-certificate-public-private-key-example-pfx-file.png\" alt=\"SSIS OAuth Connection - Configure X509 Certificate File Option for Xero Private App (Select PFX file)\" width=\"675\" height=\"512\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-xero-x509-certificate-public-private-key-example-pfx-file.png 675w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-oauth-xero-x509-certificate-public-private-key-example-pfx-file-300x228.png 300w\" sizes=\"(max-width: 675px) 100vw, 675px\" \/><\/a><p id=\"caption-attachment-1611\" class=\"wp-caption-text\">SSIS OAuth Connection &#8211; Configure X509 Certificate File Option for Xero Private App (Select PFX file)<\/p><\/div><\/li>\n<li>Click OK to save OAuth connection manager<\/li>\n<\/ol>\n<p>So <strong>in the next section<\/strong> from the upper connections, <strong>we need to use any of the one connection only<\/strong> for Xero API now let&#8217;s try to read data from Xero using\u00a0<a href=\"\/\/zappysys.com\/products\/ssis-powerpack\/ssis-json-file-source\/\" target=\"_blank\" rel=\"noopener\">SSIS JSON Source<\/a>.<\/p>\n<p><strong>Xero recently added OAuth 2.0 support so that now recommended way to use as Connection.<\/strong><\/p>\n<h3>Configure JSON \/ REST API Source &#8211; Read data from Xero<\/h3>\n<p>Now let&#8217;s look at how to configure SSIS JSON Source to read data from Xero API<\/p>\n<ol>\n<li>In the control flow ssis toolbox Drag and drop data flow task<\/li>\n<li>Double click Data flow<\/li>\n<li>Drag ZS JSON Source (REST API or File) from SSIS Toolbox and drop on Data flow designer<\/li>\n<li>Double click <a href=\"\/\/zappysys.com\/products\/ssis-powerpack\/ssis-json-file-source\/\" target=\"_blank\" rel=\"noopener\">ZS JSON Source<\/a>\u00a0to configure it.<\/li>\n<li>Set the following properties\n<ol>\n<li>Enter URL\n<pre class=\"\">https:\/\/api.xero.com\/api.xro\/2.0\/Invoices<\/pre>\n<\/li>\n<li>Check Use Credentials and select OAuth connection we created in the previous section<\/li>\n<li>For Headers grid. Click on <strong>Raw Edit<\/strong>\u00a0button and remove enter following (remove default headers)\n<pre class=\"\">Accept: application\/json<\/pre>\n<\/li>\n<li>Click on Select filter and select an array node as below to generate filter expression (e.g. $.Invoices[*] )<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<div id=\"attachment_1615\" style=\"width: 1120px\" class=\"wp-caption alignnone\"><a href=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-api-read-invoices-using-json-rest-api-source.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1615\" class=\"size-full wp-image-1615\" src=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-api-read-invoices-using-json-rest-api-source.png\" alt=\"Configure SSIS JSON \/REST API Source - Read Xero Invoices\" width=\"1110\" height=\"714\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-api-read-invoices-using-json-rest-api-source.png 1110w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-api-read-invoices-using-json-rest-api-source-300x193.png 300w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-api-read-invoices-using-json-rest-api-source-768x494.png 768w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-api-read-invoices-using-json-rest-api-source-1024x659.png 1024w\" sizes=\"(max-width: 1110px) 100vw, 1110px\" \/><\/a><p id=\"caption-attachment-1615\" class=\"wp-caption-text\">Configure SSIS JSON \/REST API Source &#8211; Read Xero Invoices<\/p><\/div>\n<p>Also, add following header in case of multiple tenants are being used in XERO environment &#8211;<\/p>\n<pre class=\"lang:default decode:true\">xero-tenant-id: &lt;TENANT ID FROM XERO&gt;<\/pre>\n<h3>Configure Xero\u00a0REST API Pagination in SSIS JSON Source<\/h3>\n<p>By default, Xero may not send you all records and you may have to setup pagination to read more data after the first response.<\/p>\n<p>For example, you like to read LineItems from Invoices. For that make sure you use below URL and include page=1 to start with. If you do not include page=1 then Line items are not returned (Yes its ODD but clearly <a href=\"https:\/\/developer.xero.com\/documentation\/api\/invoices\" target=\"_blank\" rel=\"noopener\">documented here<\/a>).<\/p>\n<ol>\n<li>Enter URL as\n<pre class=\"\">https:\/\/api.xero.com\/api.xro\/2.0\/Invoices?page=1<\/pre>\n<\/li>\n<li>Select Filter as <span class=\"lang:default decode:true crayon-inline\">$.Invoices[*].LineItems[*]<\/span><\/li>\n<li>Go to Pagination tab<\/li>\n<li>Select Pagination by URL Parameter<\/li>\n<li>Enter <strong>page<\/strong> as pagination parameter name like below\n<div id=\"attachment_457\" style=\"width: 843px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2016\/04\/ssis-rest-api-looping-url-parameter-mode.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-457\" class=\"size-full wp-image-457\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2016\/04\/ssis-rest-api-looping-url-parameter-mode.png\" alt=\"REST API Looping\/Pagination via URL Page Number Parameter (Loop until last page detected)\" width=\"833\" height=\"585\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2016\/04\/ssis-rest-api-looping-url-parameter-mode.png 833w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2016\/04\/ssis-rest-api-looping-url-parameter-mode-300x211.png 300w\" sizes=\"(max-width: 833px) 100vw, 833px\" \/><\/a><p id=\"caption-attachment-457\" class=\"wp-caption-text\">REST API Looping\/Pagination via URL Page Number Parameter (Loop until last page detected)<\/p><\/div><\/li>\n<li>Click OK to save<\/li>\n<\/ol>\n<p>Now when you run package you will see all LineItems for each Invoice will be returned.<\/p>\n<h3>Loading Xero data to SQL Server<\/h3>\n<p>Now last step is loading Xero data to SQL Server. For example purpose we will load data into SQL Server but you can load into any Target (e.g. Flat file, Oracle, Excel) using Microsoft or ZappySys Destination connectors<\/p>\n<p>To load Xero data into SQL Server perform following steps<\/p>\n<ol>\n<li>Drag OLEDB destination on Data Flow surface<\/li>\n<li>Connect ZS JSON Source to Destination<\/li>\n<li>On OLEDB destination select \/ create new SQL Connection and then Click &#8220;New Table&#8221;<\/li>\n<li>Click on Mappings tab and click OK to save<\/li>\n<li>Execute Package<\/li>\n<\/ol>\n<div id=\"attachment_1617\" style=\"width: 792px\" class=\"wp-caption alignnone\"><a href=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-to-sql-server-data-load.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1617\" class=\"size-full wp-image-1617\" src=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-to-sql-server-data-load.png\" alt=\"Configure SSIS OLEDB Destination - Loading Xero Data into SQL Server Table\" width=\"782\" height=\"593\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-to-sql-server-data-load.png 782w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-to-sql-server-data-load-300x227.png 300w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-to-sql-server-data-load-768x582.png 768w\" sizes=\"(max-width: 782px) 100vw, 782px\" \/><\/a><p id=\"caption-attachment-1617\" class=\"wp-caption-text\">Configure SSIS OLEDB Destination &#8211; Loading Xero Data into SQL Server Table<\/p><\/div>\n<div id=\"attachment_1618\" style=\"width: 744px\" class=\"wp-caption alignnone\"><a href=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-sql-server-load-mappings.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1618\" class=\"size-full wp-image-1618\" src=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-sql-server-load-mappings.png\" alt=\"Xero to SQL Server Column Mappings for OLEDB Destination\" width=\"734\" height=\"543\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-sql-server-load-mappings.png 734w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-sql-server-load-mappings-300x222.png 300w\" sizes=\"(max-width: 734px) 100vw, 734px\" \/><\/a><p id=\"caption-attachment-1618\" class=\"wp-caption-text\">Xero to SQL Server Column Mappings for OLEDB Destination<\/p><\/div>\n<div id=\"attachment_1619\" style=\"width: 293px\" class=\"wp-caption alignnone\"><a href=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-loading-data-from-xero-to-sql-server.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1619\" class=\"size-full wp-image-1619\" src=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-loading-data-from-xero-to-sql-server.png\" alt=\"Loading Xero data to SQL Server in SSIS\" width=\"283\" height=\"391\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-loading-data-from-xero-to-sql-server.png 283w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-loading-data-from-xero-to-sql-server-217x300.png 217w\" sizes=\"(max-width: 283px) 100vw, 283px\" \/><\/a><p id=\"caption-attachment-1619\" class=\"wp-caption-text\">Loading Xero data to SQL Server in SSIS<\/p><\/div>\n<h2>POST data to Xero (Insert or Update)<\/h2>\n<p>So far we have seen how to read data from Xero. Now let&#8217;s look at how to write data to Xero.<\/p>\n<p>There are two ways you can achieve this.<\/p>\n<ol>\n<li>Use <a href=\"\/\/zappysys.com\/products\/ssis-powerpack\/ssis-web-api-destination-connector\/\" target=\"_blank\" rel=\"noopener\">Web API Destination<\/a> in Data Flow<\/li>\n<li>Use <a href=\"\/\/zappysys.com\/products\/ssis-powerpack\/ssis-rest-api-web-service-task\/\" target=\"_blank\" rel=\"noopener\">REST API Task<\/a> in Control Flow<\/li>\n<\/ol>\n<p>Read this article to learn more about <a href=\"\/\/zappysys.com\/blog\/http-post-in-ssis-send-data-to-web-api-url-json-xml\/\" target=\"_blank\" rel=\"noopener\">API POST using SSIS<\/a><\/p>\n<h3>Using SSIS Web API Task (Write data from SQL Server to Xero)<\/h3>\n<h3><img decoding=\"async\" src=\"https:\/\/i0.wp.com\/zappysys.com\/onlinehelp\/ssis-powerpack\/scr\/images\/web-api-destination\/ssis-web-api-destination-post-json-to-rest-api-url.png?resize=503%2C403\" alt=\"SSIS Web API Destination - POST JSON to REST API Endpoint, Create \/ Update records\" \/><\/h3>\n<h3>Using REST API Task to POST data to Xero<\/h3>\n<p>If you have JSON\/XML data already prepared and if you like to POST it to Xero API then REST API Task would be easy to use.<\/p>\n<p>REST API Task Body can be direct string, variable (e.g. {{User::varSomeData}} or <a href=\"https:\/\/zappysys.com\/blog\/rest-api-file-upload-using-ssis-multi-part-post\/\" target=\"_blank\" rel=\"noopener\">Body can come from File\u00a0<\/a><\/p>\n<div id=\"attachment_1616\" style=\"width: 872px\" class=\"wp-caption alignnone\"><a href=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-post-data-xero-api-create-contacts-example.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1616\" class=\"size-full wp-image-1616\" src=\"\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-post-data-xero-api-create-contacts-example.png\" alt=\"SSIS REST API Task - POST data to Xero (Create contacts)\" width=\"862\" height=\"602\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-post-data-xero-api-create-contacts-example.png 862w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-post-data-xero-api-create-contacts-example-300x210.png 300w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-post-data-xero-api-create-contacts-example-768x536.png 768w\" sizes=\"(max-width: 862px) 100vw, 862px\" \/><\/a><p id=\"caption-attachment-1616\" class=\"wp-caption-text\">SSIS REST API Task &#8211; POST data to Xero (Create contacts)<\/p><\/div>\n<h2>Read data from Xero Report API<\/h2>\n<p>In previous examples we saw how to read data from various Xero API endpoints but now lets look at how to call <a href=\"https:\/\/developer.xero.com\/documentation\/api\/reports\" target=\"_blank\" rel=\"noopener\">Xero Report API<\/a>. For example if you like to extract data displayed in below then you can extract it in Xml or JSON format. Below report is in HTML format but we will show you how to get similar information in JSON format and load into SQL Server Table.<\/p>\n<div style=\"width: 460px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full\" src=\"https:\/\/www.xero.com\/blog\/wp-content\/uploads\/\/2008\/10\/pandlreport.png\" alt=\"Xero Report Example - View Profit and Loss Report in Xero Portal\" width=\"450\" height=\"257\" \/><p class=\"wp-caption-text\">Xero Report Example &#8211; View Profit and Loss Report in Xero Portal<\/p><\/div>\n<p>To extract above information you can call below API Endpoint (e.g. <a href=\"https:\/\/developer.xero.com\/documentation\/api\/reports#ProfitAndLoss\" target=\"_blank\" rel=\"noopener\">Profit &amp; Loss Report<\/a>)<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">GET \r\nhttps:\/\/api.xero.com\/api.xro\/2.0\/Reports\/ProfitAndLoss?fromDate=2017-02-01&amp;toDate=2017-02-28<\/pre>\n<p>You can use Variables to make above URL dynamic in JSON Source as below<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">https:\/\/api.xero.com\/api.xro\/2.0\/Reports\/ProfitAndLoss?fromDate={{User::StartDate,yyyy-MM-dd}}&amp;toDate={{User::EndDate,yyyy-MM-dd}}<\/pre>\n<p>Each report has its own API URL so make sure you refer to the connect URL for calling different report.<\/p>\n<p>Here is sample response from API<\/p>\n<pre class=\"lang:js decode:true\">{\r\n  \"Reports\": [\r\n    {\r\n      \"ReportID\": \"ProfitAndLoss\",\r\n      \"ReportName\": \"Profit and Loss\",\r\n      \"ReportType\": \"ProfitAndLoss\",\r\n      \"ReportTitles\": [\r\n        \"Profit &amp; Loss\",\r\n        \"Demo Company (AU)\",\r\n        \"1 February 2018 to 28 February 2018\"\r\n      ],\r\n      \"ReportDate\": \"25 February 2018\",\r\n      \"UpdatedDateUTC\": \"\\\/Date(1519593468971)\\\/\",\r\n      \"Rows\": [\r\n        {\r\n          \"RowType\": \"Header\",\r\n          \"Cells\": [\r\n            { \"Value\": \"\" },\r\n            { \"Value\": \"28 Feb 18\" },\r\n            { \"Value\": \"28 Jan 18\" }\r\n          ]\r\n        },\r\n        {\r\n          \"RowType\": \"Section\",\r\n          \"Title\": \" Income\",\r\n          \"Rows\": [\r\n            {\r\n              \"RowType\": \"Row\",\r\n              \"Cells\": [\r\n                {\r\n                  \"Value\": \"Sales\",\r\n                  \"Attributes\": [\r\n                    {\r\n                      \"Value\": \"e2bacdc6-2006-43c2-a5da-3c0e5f43b452\",\r\n                      \"Id\": \"account\"\r\n                    }\r\n                  ]\r\n                },{\r\n                  \"Value\": \"9220.05\",\r\n                  \"Attributes\": [\r\n                    {\r\n                      \"Value\": \"e2bacdc6-2006-43c2-a5da-3c0e5f43b452\",\r\n                      \"Id\": \"account\"\r\n                    }\r\n                  ]\r\n                },{\r\n                  \"Value\": \"5120.05\",\r\n                  \"Attributes\": [\r\n                    {\r\n                      \"Value\": \"e2bacdc6-2006-43c2-a5da-3c0e5f43b452\",\r\n                      \"Id\": \"account\"\r\n                    }\r\n                  ]\r\n                }\r\n              ]\r\n            },\r\n            {\r\n              \"RowType\": \"SummaryRow\",\r\n              \"Cells\": [\r\n                { \"Value\": \"Total Income\" },\r\n                { \"Value\": \"9220.05\" },\r\n                { \"Value\": \"1250.09\" }\r\n              ]\r\n            }\r\n          ]\r\n        },{\r\n          \"RowType\": \"Section\",\r\n          \"Rows\": [\r\n            {\r\n              \"RowType\": \"Row\",\r\n              \"Cells\": [\r\n                { \"Value\": \"NET PROFIT\" },\r\n                { \"Value\": \"-6250.09\" },\r\n                { \"Value\": \"-7250.09\" }\r\n              ]\r\n            }\r\n          ]\r\n        }\r\n      ]\r\n    }\r\n  ]\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>Now lets look at steps to configure JSON Source to extract your Xero Report Data.<\/p>\n<ol>\n<li>Drag new JSON Source from SSIS Toolbox<\/li>\n<li>Double click JSON Source to configure it<\/li>\n<li>In the Path \/ Web URL, enter API Report URL to call desired Report Start \/ End Date or any other expected Parameter by report (<strong>Refer to API Documentation<\/strong>). For our example we will enter below URL\n<pre class=\"lang:default highlight:0 decode:true\">https:\/\/api.xero.com\/api.xro\/2.0\/Reports\/ProfitAndLoss?fromDate=2017-02-01&amp;toDate=2017-02-28<\/pre>\n<\/li>\n<li>Check <strong>Use Credentials<\/strong> and Select Connection we created in the Previous Section<\/li>\n<li>In the Filter enter <span class=\"lang:default highlight:0 decode:true crayon-inline \">$.Reports[*].Rows[*].Rows[*]<\/span><\/li>\n<li>Now go to 2D Array Transform Tab and configure like below. If your UI varies then use Properties window to edit property manually.<br \/>\nBasically you need to edit<br \/>\n<strong>Transformation Type:<\/strong> <span class=\"lang:default highlight:0 decode:true crayon-inline \">2-dimensional array<\/span><br \/>\n<strong>Column Name Filter:<\/strong> <span class=\"lang:default highlight:0 decode:true crayon-inline \">$.Reports[0].Rows[*].Cells[*].Value<\/span><br \/>\n<strong>Row Values Filter:<\/strong> <span class=\"lang:default highlight:0 decode:true crayon-inline\">$.Cells[*].Value<\/span><\/li>\n<li>Now Click Preview Data. If you get error Column &#8221; does not belong to table nosqldata. Then most likely you using old version with Known Issue (i.e. v2.9.7.10822 or older). Get latest version for fix. For workaround of this issue you must follow next section to specify columns manually. Columns must match count.<\/li>\n<\/ol>\n<p>Here is how it will look like.<\/p>\n<div id=\"attachment_8037\" style=\"width: 680px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-api-filter-options-extract-report.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8037\" class=\"size-full wp-image-8037\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-api-filter-options-extract-report.png\" alt=\"Configure Transform Options for Xero Report API (Dynamic Column Title)\" width=\"670\" height=\"166\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-api-filter-options-extract-report.png 670w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-api-filter-options-extract-report-300x74.png 300w\" sizes=\"(max-width: 670px) 100vw, 670px\" \/><\/a><p id=\"caption-attachment-8037\" class=\"wp-caption-text\">Configure Transform Options for Xero Report API (Dynamic Column Title)<\/p><\/div>\n<div id=\"attachment_8039\" style=\"width: 842px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-read-report-api-json-source.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8039\" class=\"size-full wp-image-8039\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-read-report-api-json-source.png\" alt=\"Read from Xero Report API using JSON Source in SSIS (Dynamic Columns Example)\" width=\"832\" height=\"526\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-read-report-api-json-source.png 832w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-read-report-api-json-source-300x190.png 300w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-read-report-api-json-source-768x486.png 768w\" sizes=\"(max-width: 832px) 100vw, 832px\" \/><\/a><p id=\"caption-attachment-8039\" class=\"wp-caption-text\">Read from Xero Report API using JSON Source in SSIS (Dynamic Columns Example)<\/p><\/div>\n<h3>Fixing Dynamic Columns Problem in for Xero Report API<\/h3>\n<p>Now let&#8217;s look at one common scenario which you have to think. SSIS data flow has fixed metadata so if your Report is generating Dynamic Columns each time based on Date Range then it will be trouble for you because all your columns may come as null if initial date range changes.<\/p>\n<p>To address this issue you have to use Static Column Names as below.<\/p>\n<div class=\"su-note\"  style=\"border-color:#e5de9d;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\"><div class=\"su-note-inner su-u-clearfix su-u-trim\" style=\"background-color:#fff8b7;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\">NOTE: You must enter exact same number of columns returned in the Header Row section or more. If you enter less number of columns then you will get error. For example in previous sample report screen we have following 6 Columns. Portal HTML report page shows YTD as extra column but API may not return this column so you will have to count it as 5 columns in below example. Best thing is enter 13 or more columns (typically covers 12 months data). If report doesn&#8217;t return all columns then you will get some as NULL but its ok because it will not fail.<\/div><\/div>\n<pre class=\"lang:default highlight:0 decode:true\">Account (or sometimes blank) | Oct 08 | Sep 08 | Aug 08 | Jul 08 | YTD<\/pre>\n<p>In above case you have to enable following properties. (Below Screenshot has Col1,Col2&#8230;.. Col13\u00a0 but you can enter less number of columns based on above logic of column count).<\/p>\n<p><strong>NOTE:<\/strong> Use <a href=\"https:\/\/zappysys.com\/blog\/call-rest-api-using-ssis-web-service-task\/\" target=\"_blank\" rel=\"noopener\">REST API Task<\/a> to obtain Raw JSON and review First Row which contains Number of columns<br \/>\nFor example if your API return some thing like below then you can use <strong>5 columns<\/strong> (<strong>one Blank header + 4 Months<\/strong>)<\/p>\n<pre class=\"lang:js decode:true\">      \"Rows\": [\r\n        {\r\n          \"RowType\": \"Header\",\r\n          \"Cells\": [\r\n            { \"Value\": \"\" },\r\n            { \"Value\": \"28 Feb 18\" }\r\n            { \"Value\": \"28 Mar 18\" }\r\n            { \"Value\": \"28 Apr 18\" }\r\n            { \"Value\": \"28 May 18\" }\r\n          ]\r\n        },<\/pre>\n<p>Once we know how many columns we should expect from API response, we can perform following steps. We will now configure our JSON Source component to use Static Columns.<\/p>\n<ol>\n<li>Drag new JSON Source from SSIS Toolbox<\/li>\n<li>Right click JSON Source &gt; Click on Properties (You can do below using UI too but in old version no option for that &#8211; See below this section)<\/li>\n<li>Enter following values for property\n<ol>\n<li><strong>Filter:<\/strong>\u00a0<span class=\"lang:default highlight:0 decode:true crayon-inline\">$.Reports[*].Rows[*].Rows[*]<\/span><\/li>\n<li><strong>ArrayTransformationType:<\/strong> <span class=\"lang:default highlight:0 decode:true crayon-inline \">TransformComplexTwoDimensionalArray<\/span><\/li>\n<li><strong>ArrayTransCustomColumns:<\/strong> <span class=\"lang:default highlight:0 decode:true crayon-inline\">Col1,Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10,Col11,Col12,Col13<\/span>\u00a0 \u00a0\u00a0<strong>(Assuming you have 12 months to compare)<\/strong><\/li>\n<li><strong>ArrayEnableCustomColumn:<\/strong> <span class=\"lang:default highlight:0 decode:true crayon-inline \">True<\/span><\/li>\n<li><strong>ArrayTransRowValueFilter:<\/strong> <span class=\"lang:default highlight:0 decode:true crayon-inline \">$.Cells[*].Value<\/span><\/li>\n<\/ol>\n<\/li>\n<li>Now double click JSON Source to configure<\/li>\n<li>In the Path \/ Web URL, enter API Report URL to call desired Report Start \/ End Date or any other expected Parameter by report (<strong>Refer to API Documentation<\/strong>). For our example we will enter below URL\n<pre class=\"lang:default highlight:0 decode:true\">https:\/\/api.xero.com\/api.xro\/2.0\/Reports\/ProfitAndLoss?fromDate=2017-02-01&amp;toDate=2017-02-28<\/pre>\n<\/li>\n<li>Check <strong>Use Credentials<\/strong> and Select Connection we created in the Previous Section<\/li>\n<li>In the Filter enter <span class=\"lang:default highlight:0 decode:true crayon-inline\">$.Reports[*].Rows[*].Rows[*]<\/span><\/li>\n<li>Now click Preview.<\/li>\n<\/ol>\n<p><strong>For Old Version use Properties Grid<\/strong><\/p>\n<div id=\"attachment_8040\" style=\"width: 946px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/configure-json-source-xero-api-extract.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8040\" class=\"size-full wp-image-8040\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/configure-json-source-xero-api-extract.png\" alt=\"Configure Xero Report Data Extract using SSIS Property Grid (For Older Version)\" width=\"936\" height=\"321\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/configure-json-source-xero-api-extract.png 936w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/configure-json-source-xero-api-extract-300x103.png 300w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/configure-json-source-xero-api-extract-768x263.png 768w\" sizes=\"(max-width: 936px) 100vw, 936px\" \/><\/a><p id=\"caption-attachment-8040\" class=\"wp-caption-text\">Configure Xero Report Data Extract using SSIS Property Grid (For Older Version)<\/p><\/div>\n<p><strong>For New Version Use UI (It has Specify Columns Manually Option)<\/strong><\/p>\n<div id=\"attachment_8038\" style=\"width: 915px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-read-report-api-static-columns.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-8038\" class=\"size-full wp-image-8038\" src=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-read-report-api-static-columns.png\" alt=\"Read from Xero Report API using parameters in JSON Source in SSIS (Static Columns Example)\" width=\"905\" height=\"532\" srcset=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-read-report-api-static-columns.png 905w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-read-report-api-static-columns-300x176.png 300w, https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/ssis-xero-read-report-api-static-columns-768x451.png 768w\" sizes=\"(max-width: 905px) 100vw, 905px\" \/><\/a><p id=\"caption-attachment-8038\" class=\"wp-caption-text\">Read from Xero Report API using parameters in JSON Source in SSIS (Static Columns Example)<\/p><\/div>\n<p>&nbsp;<\/p>\n<h2>Common Errors<\/h2>\n<div class=\"content_block\" id=\"custom_post_widget-1887\"><h3>Truncation related error<\/h3>\r\n<p style=\"text-align: justify;\">The most common error you may face when you run an SSIS package is truncation error. During the design time only 300 rows are scanned from a source (a file or a REST API call response) to detect datatypes but at runtime, it is likely you will retrieve far more records. So it is possible that you will get longer strings than initially expected.\u00a0For detailed instructions on how to fix common metadata related errors read an article \"<a href=\"\/\/zappysys.com\/blog\/handling-ssis-component-metadata-issues\/\" target=\"_blank\" rel=\"noopener\">How to handle SSIS errors (truncation, metadata issues)<\/a>\".<\/p>\r\n\r\n<h3>Authentication related error<\/h3>\r\nAnother frequent error you may get is an authentication error, which happens when you deploy\/copy a package to another machine and run it there. Check <a href=\"#Deployment_to_Production\">the paragraph below<\/a>\u00a0to see why it happens and how to solve this problem.<\/div>\n<h2>Deployment to Production<\/h2>\n<div class=\"content_block\" id=\"custom_post_widget-1932\"><p style=\"text-align: justify;\">In SSIS package <a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/integration-services\/security\/access-control-for-sensitive-data-in-packages\" target=\"_blank\" rel=\"noopener\">sensitive data such as tokens and passwords are by default encrypted by SSIS<\/a> with your Windows account which you use to create a package.\u00a0So SSIS will fail to decrypt tokens\/passwords when you run it from another machine using another Windows account. To circumvent this when you are creating an SSIS package which uses authentication components (e.g. an <a href=\"https:\/\/zappysys.com\/onlinehelp\/ssis-powerpack\/scr\/ssis-oauth-connection-manager.htm\" target=\"_blank\" rel=\"noopener\">OAuth Connection Manager<\/a>\u00a0or an <a href=\"https:\/\/zappysys.com\/onlinehelp\/ssis-powerpack\/scr\/ssis-http-connection-manager.htm\" target=\"_blank\" rel=\"noopener\">HTTP Connection Manager<\/a> with credentials, etc.), consider using parameters\/variables to pass tokens\/passwords. In this way, you won\u2019t face authentication related errors when a package is deployed to a production server.<\/p>\r\n<p style=\"text-align: justify;\">Check our article on <a href=\"https:\/\/zappysys.com\/blog\/how-to-run-an-ssis-package-with-sensitive-data-on-sql-server\/\" target=\"_blank\" rel=\"noopener\">how to configure packages with sensitive data on your production or development server<\/a>.<\/p><\/div>\n<h2><span id=\"ConclusionWhat8217s_next\">Conclusion.\u00a0What\u2019s next?<\/span><\/h2>\n<p>In this article we have learned how to load data from Xero to SQL Server using SSIS ( drag and drop approach without coding). We used\u00a0<a href=\"https:\/\/zappysys.com\/products\/ssis-powerpack\/\" target=\"_blank\" rel=\"noopener\">SSIS JSON \/ REST API Connector<\/a>\u00a0to extract data from Xero REST API using OAuth. JSON Source makes it super simple to parsing complex \/ large JSON Files or any Web API Response into rows and column so you can load into database like SQL Server.\u00a0<a href=\"\/\/zappysys.com\/products\/ssis-powerpack\/\">Download SSIS PowerPack<\/a>\u00a0to try many other automation scenarios not discussed in this article.<\/p>\n<p><strong>Keywords:<\/strong><\/p>\n<p>Xero Integration with SQL Server | How to extract data from Xero in SSIS? | How to read data from Xero API? | Loading Xero Data into SQL Server. | Xero to SQL Server | SQL Server to Xero | SSIS Xero Integration<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Xero is well known Cloud based Accounting Software. In this post you will learn how to implement Xero API Integration with SQL Server or any other RDBMS (e.g. Oracle, MySQL, Postgresql) using SSIS in few clicks. We will use SSIS JSON Source to Read data from Xero and Load into SQL Server \/ other [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1621,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[225,17],"tags":[215,60,153,580,223,3,148,174,222,220,221],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\r\n<title>How to read\/load data in Xero using SSIS | ZappySys Blog<\/title>\r\n<meta name=\"description\" content=\"Xero API Integration in SSIS without coding. Learn How to extract \/ load data from Xero to SQL Server Table. Use Xero OAuth Private App (X509 Certificate)\" \/>\r\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\r\n<link rel=\"canonical\" href=\"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/\" \/>\r\n<meta property=\"og:locale\" content=\"en_US\" \/>\r\n<meta property=\"og:type\" content=\"article\" \/>\r\n<meta property=\"og:title\" content=\"How to read\/load data in Xero using SSIS | ZappySys Blog\" \/>\r\n<meta property=\"og:description\" content=\"Xero API Integration in SSIS without coding. Learn How to extract \/ load data from Xero to SQL Server Table. Use Xero OAuth Private App (X509 Certificate)\" \/>\r\n<meta property=\"og:url\" content=\"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/\" \/>\r\n<meta property=\"og:site_name\" content=\"ZappySys Blog\" \/>\r\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/ZappySys\/\" \/>\r\n<meta property=\"article:published_time\" content=\"2017-07-25T03:02:24+00:00\" \/>\r\n<meta property=\"article:modified_time\" content=\"2025-03-31T13:44:42+00:00\" \/>\r\n<meta property=\"og:image\" content=\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration.png\" \/>\r\n\t<meta property=\"og:image:width\" content=\"375\" \/>\r\n\t<meta property=\"og:image:height\" content=\"374\" \/>\r\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\r\n<meta name=\"author\" content=\"ZappySys\" \/>\r\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\r\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/zappysys\/\" \/>\r\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"ZappySys\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\r\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/\",\"url\":\"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/\",\"name\":\"How to read\/load data in Xero using SSIS | ZappySys Blog\",\"isPartOf\":{\"@id\":\"https:\/\/zappysys.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration.png\",\"datePublished\":\"2017-07-25T03:02:24+00:00\",\"dateModified\":\"2025-03-31T13:44:42+00:00\",\"author\":{\"@id\":\"https:\/\/zappysys.com\/blog\/#\/schema\/person\/2756c237457fbc95d82cb38962f81f82\"},\"description\":\"Xero API Integration in SSIS without coding. Learn How to extract \/ load data from Xero to SQL Server Table. Use Xero OAuth Private App (X509 Certificate)\",\"breadcrumb\":{\"@id\":\"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/#primaryimage\",\"url\":\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration.png\",\"contentUrl\":\"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration.png\",\"width\":375,\"height\":374},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/zappysys.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to read\/load data in Xero using SSIS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/zappysys.com\/blog\/#website\",\"url\":\"https:\/\/zappysys.com\/blog\/\",\"name\":\"ZappySys Blog\",\"description\":\"SSIS \/ ODBC Drivers \/ API Connectors for JSON, XML, Azure, Amazon AWS, Salesforce, MongoDB and more\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/zappysys.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/zappysys.com\/blog\/#\/schema\/person\/2756c237457fbc95d82cb38962f81f82\",\"name\":\"ZappySys\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/zappysys.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5c9be148088ba9b8af8e955c5f7c22b5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5c9be148088ba9b8af8e955c5f7c22b5?s=96&d=mm&r=g\",\"caption\":\"ZappySys\"},\"sameAs\":[\"http:\/\/www.zappysys.com\/\",\"https:\/\/www.facebook.com\/ZappySys\/\",\"https:\/\/twitter.com\/https:\/\/twitter.com\/zappysys\/\"],\"url\":\"https:\/\/zappysys.com\/blog\/author\/admin\/\"}]}<\/script>\r\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to read\/load data in Xero using SSIS | ZappySys Blog","description":"Xero API Integration in SSIS without coding. Learn How to extract \/ load data from Xero to SQL Server Table. Use Xero OAuth Private App (X509 Certificate)","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/","og_locale":"en_US","og_type":"article","og_title":"How to read\/load data in Xero using SSIS | ZappySys Blog","og_description":"Xero API Integration in SSIS without coding. Learn How to extract \/ load data from Xero to SQL Server Table. Use Xero OAuth Private App (X509 Certificate)","og_url":"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/","og_site_name":"ZappySys Blog","article_author":"https:\/\/www.facebook.com\/ZappySys\/","article_published_time":"2017-07-25T03:02:24+00:00","article_modified_time":"2025-03-31T13:44:42+00:00","og_image":[{"width":375,"height":374,"url":"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration.png","type":"image\/png"}],"author":"ZappySys","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/zappysys\/","twitter_misc":{"Written by":"ZappySys","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/","url":"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/","name":"How to read\/load data in Xero using SSIS | ZappySys Blog","isPartOf":{"@id":"https:\/\/zappysys.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/#primaryimage"},"image":{"@id":"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/#primaryimage"},"thumbnailUrl":"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration.png","datePublished":"2017-07-25T03:02:24+00:00","dateModified":"2025-03-31T13:44:42+00:00","author":{"@id":"https:\/\/zappysys.com\/blog\/#\/schema\/person\/2756c237457fbc95d82cb38962f81f82"},"description":"Xero API Integration in SSIS without coding. Learn How to extract \/ load data from Xero to SQL Server Table. Use Xero OAuth Private App (X509 Certificate)","breadcrumb":{"@id":"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/#primaryimage","url":"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration.png","contentUrl":"https:\/\/zappysys.com\/blog\/wp-content\/uploads\/2017\/07\/xero-integration.png","width":375,"height":374},{"@type":"BreadcrumbList","@id":"https:\/\/zappysys.com\/blog\/reading-loading-data-in-xero-sql-server-ssis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zappysys.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to read\/load data in Xero using SSIS"}]},{"@type":"WebSite","@id":"https:\/\/zappysys.com\/blog\/#website","url":"https:\/\/zappysys.com\/blog\/","name":"ZappySys Blog","description":"SSIS \/ ODBC Drivers \/ API Connectors for JSON, XML, Azure, Amazon AWS, Salesforce, MongoDB and more","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zappysys.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/zappysys.com\/blog\/#\/schema\/person\/2756c237457fbc95d82cb38962f81f82","name":"ZappySys","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zappysys.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5c9be148088ba9b8af8e955c5f7c22b5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c9be148088ba9b8af8e955c5f7c22b5?s=96&d=mm&r=g","caption":"ZappySys"},"sameAs":["http:\/\/www.zappysys.com\/","https:\/\/www.facebook.com\/ZappySys\/","https:\/\/twitter.com\/https:\/\/twitter.com\/zappysys\/"],"url":"https:\/\/zappysys.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/zappysys.com\/blog\/wp-json\/wp\/v2\/posts\/1602"}],"collection":[{"href":"https:\/\/zappysys.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zappysys.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zappysys.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zappysys.com\/blog\/wp-json\/wp\/v2\/comments?post=1602"}],"version-history":[{"count":28,"href":"https:\/\/zappysys.com\/blog\/wp-json\/wp\/v2\/posts\/1602\/revisions"}],"predecessor-version":[{"id":11299,"href":"https:\/\/zappysys.com\/blog\/wp-json\/wp\/v2\/posts\/1602\/revisions\/11299"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/zappysys.com\/blog\/wp-json\/wp\/v2\/media\/1621"}],"wp:attachment":[{"href":"https:\/\/zappysys.com\/blog\/wp-json\/wp\/v2\/media?parent=1602"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zappysys.com\/blog\/wp-json\/wp\/v2\/categories?post=1602"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zappysys.com\/blog\/wp-json\/wp\/v2\/tags?post=1602"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}