# SaaS Connectivity: Building Your First Connector

**URL:** <https://developer.sailpoint.com/discuss/t/saas-connectivity-building-your-first-connector/8142>\
**Category:** Video Library\
**Tags:** developer-days-2023-idn, sailpoint-identity-security, developer-days\
**Created:** [February 10, 2023, 7:16pm UTC](https://developer.sailpoint.com/discuss/t/saas-connectivity-building-your-first-connector/8142 "2023-02-10T19:16:33Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![philip-ellis](https://sea1.discourse-cdn.com/sailpoint/discuss/user_avatar/developer.sailpoint.com/philip-ellis/32/502_2.png) [@philip-ellis](https://developer.sailpoint.com/discuss/u/philip-ellis)\
**Post date:** [February 10, 2023, 7:16pm UTC](https://developer.sailpoint.com/discuss/t/saas-connectivity-building-your-first-connector/8142/1 "2023-02-10T19:16:33Z")

</div>

[![](https://global.discourse-cdn.com/sailpoint/original/2X/1/151d3a0851b5619abe4fd15d73bda649319704a2.jpeg "Developer Days 2023 - IdentityNow, Building Your First SaaS Connector") ](https://www.youtube.com/watch?v=wHHje_ItTKQ)

## Additional Resources

- Presentation: [Building Your First Connector.pptx](https://developer.sailpoint.com/discuss/uploads/short-url/uDaWm11LfsXU5fgdQXVBniLFelp.pptx) (2.2 MB)

- If you want to see the code that was built during the presentation, it’s all here: [GitHub - philip-ellis-sp/developer-days-2023-airtable-connector: The airtable connector that was built live during the developer days conference](https://github.com/philip-ellis-sp/developer-days-2023-airtable-connector)

---

<div class="post-metadata">

**Author:** ![mikechung](https://sea1.discourse-cdn.com/sailpoint/discuss/user_avatar/developer.sailpoint.com/mikechung/32/36607_2.png) [@mikechung](https://developer.sailpoint.com/discuss/u/mikechung)\
**Post date:** [March 10, 2023, 9:00am UTC](https://developer.sailpoint.com/discuss/t/saas-connectivity-building-your-first-connector/8142/4 "2023-03-10T09:00:09Z")

</div>

Hello Philip,

Thanks a lot. This is an very interesting topic. May I ask some questions here:

- What’s the environment setup required here, I assume it’s Windows, but I am confused how can we run the commands (such as sail, spcx), should we install any package locally?
- I noticed in one of the post, it mentioned there is a [SailPoint CLI utility](https://github.com/sailpoint/sp-cli), but the link seems not exists any more.
- And if I understand correctly, this SaaS connector only handles endpoints connectivity which sits on cloud in IDN? it seems to WebServices connector of IIQ but in JavaScript, am I correct?
- Also, do you have any idea, can such framework also used to connect application which is on-premise?

Sorry, due to private appointments, I did not make it to join the full live streaming in IDN part. And I am relatively new to IDN.

Thanks and regards,  
Mike

---

<div class="post-metadata">

**Author:** ![philip-ellis](https://sea1.discourse-cdn.com/sailpoint/discuss/user_avatar/developer.sailpoint.com/philip-ellis/32/502_2.png) [@philip-ellis](https://developer.sailpoint.com/discuss/u/philip-ellis)\
**Post date:** [March 10, 2023, 4:05pm UTC](https://developer.sailpoint.com/discuss/t/saas-connectivity-building-your-first-connector/8142/5 "2023-03-10T16:05:33Z")

</div>

> [@mikechung](#):
>
> Hello Philip,
> 
> Thanks a lot. This is an very interesting topic. May I ask some questions here:
> 
> - What’s the environment setup required here, I assume it’s Windows, but I am confused how can we run the commands (such as sail, spcx), should we install any package locally?
> - I noticed in one of the post, it mentioned there is a [SailPoint CLI utility](https://github.com/sailpoint/sp-cli), but the link seems not exists any more.
> - And if I understand correctly, this SaaS connector only handles endpoints connectivity which sits on cloud in IDN? it seems to WebServices connector of IIQ but in JavaScript, am I correct?
> - Also, do you have any idea, can such framework also used to connect application which is on-premise?

- Environment – All you need is visual studio code and node/npm installed to get going. For full documentation, see here: [https://developer.sailpoint.com/idn/docs/saas-connectivity](https://developer.sailpoint.com/idn/docs/saas-connectivity)
- The CLI tool can be found here: [Releases · sailpoint-oss/sailpoint-cli · GitHub](https://github.com/sailpoint-oss/sailpoint-cli/releases)
- SaaS is a cloud based connector, so it is running in the IDN cloud. Because of this, the best use cases are for connecting to other cloud based resources
- Right now to connect a SaaS connector to an on-prem source, you would need to somehow expose that on-prem source to the internet. It is probably best to use the VA in those cases since you have better control over access. As @bwong1 mentioned during the roadmap session, a SaaS connector that can run on-prem might be available in the longer term future.

---

<div class="post-metadata">

**Author:** ![jagadeepg](https://avatars.discourse-cdn.com/v4/letter/j/e9a140/32.png) [@jagadeepg](https://developer.sailpoint.com/discuss/u/jagadeepg)\
**Post date:** [March 23, 2023, 8:18pm UTC](https://developer.sailpoint.com/discuss/t/saas-connectivity-building-your-first-connector/8142/6 "2023-03-23T20:18:55Z")

</div>

Hi @philip-ellis,

I have tried to onboard the SaaS Airtable connector. Able to create and read accounts from local machine using postman.

Deployed connector into IDN:  
The test connection is success. **However the account aggregation is failing with following error message:**  
`java.lang.RuntimeException - java.lang.IllegalStateException: [ConnectorError] invalid output format: Schema validation error in path: [/: {"attributes":{"emai... did not match any of the specified OneOf schemas] (requestId: 95f1495a865f41348f7837bc220db1d3) - java.lang.RuntimeException: java.lang.IllegalStateException: [ConnectorError] invalid output format: Schema validation error in path: [/: {"attributes":{"emai... did not match any of the specified OneOf schemas] (requestId: 95f1495a865f41348f7837bc220db1d3) at com.sailpoint.mantis.qpoc.message.AccountAggregation.iterateResourceObjects(AccountAggregation.java:628) at com.sailpoint.mantis.qpoc.message.AccountAggregation.handleMessage_aroundBody0(AccountAggregation.java:333) at com.sailpoint.mantis.qpoc.message.AccountAggregation$AjcClosure1.run(AccountAggregation.java:1) at org.aspectj.runtime.reflect.JoinPointImpl.proceed(JoinPointImpl.java:167) at com.sailpoint.atlas.metrics.MessageMetricsAspect.meterMessageTimeAndExceptions(MessageMetricsAspect.java:68) at com.sailpoint.mantis.qpoc.message.AccountAggregation.handleMessage(AccountAggregation.java:320) at com.sailpoint.atlas.messaging.server.TypeMessageHandler.handleMessage(TypeMessageHandler.java:87) at com.sailpoint.mantis.qpoc.QpocMessageHandler.handleMessage(QpocMessageHandler.java:50) at com.sailpoint.mantis.platform.message.ObjectConfigMessageHandler.handleMessage(ObjectConfigMessageHandler.java:33) at com.sailpoint.atlas.tracing.plugin.TracingMessageHandler.handleMessage(TracingMessageHandler.java:88) at com.sailpoint.atlas.message.DynamicMessageHandler$ChainedMessageHandlerAdapter.handleMessage(DynamicMessageHandler.java:46) at com.sailpoint.atlas.usage.plugin.UsageMessageHandler.handleMessage(UsageMessageHandler.java:36) at com.sailpoint.atlas.message.DynamicMessageHandler$ChainedMessageHandlerAdapter.handleMessage(DynamicMessageHandler.java:46) at com.sailpoint.atlas.message.DynamicMessageHandler.handleMessage(DynamicMessageHandler.java:36) at com.sailpoint.mantis.platform.message.SailPointContextMessageHandler.handleMessage(SailPointContextMessageHandler.java:55) at com.sailpoint.atlas.message.FailureNotificationHandler.handleMessage(FailureNotificationHandler.java:55) at com.sailpoint.atlas.message.RequestContextMessageHandler.handleMessage(RequestContextMessageHandler.java:72) at com.sailpoint.mantis.platform.message.ExceptionMessageHandler.handleMessage(ExceptionMessageHandler.java:49) at com.sailpoint.atlas.messaging.server.MessageProcessor.handleJobMessage(MessageProcessor.java:196) at com.sailpoint.atlas.messaging.server.MessageProcessor.handleMessage(MessageProcessor.java:129) at com.sailpoint.atlas.messaging.server.MessageProcessor.lambda$null$0(MessageProcessor.java:99) at com.sailpoint.atlas.messaging.server.MessageProcessor.withOrgLogging(MessageProcessor.java:171) at com.sailpoint.atlas.messaging.server.MessageProcessor.lambda$asyncHandleMessage$1(MessageProcessor.java:99) at com.sailpoint.atlas.messaging.server.impl.SourceRunnableImpl.run(SourceRunnableImpl.java:77) at com.sailpoint.atlas.messaging.server.impl.BufferedSourceQueue$IncrementingSourceRunnable.run(BufferedSourceQueue.java:181) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: java.lang.IllegalStateException: [ConnectorError] invalid output format: Schema validation error in path: [/: {"attributes":{"emai... did not match any of the specified OneOf schemas] (requestId: 95f1495a865f41348f7837bc220db1d3) at com.sailpoint.connector.cloud.spconnect.SpConnectProxy$1.nextResponse(SpConnectProxy.java:277) at sailpoint.connector.cloud.CloudConnector$CloudBridgeIterator.buildDataBlockIterator(CloudConnector.java:1109) at sailpoint.connector.cloud.CloudConnector$CloudBridgeIterator.checkForMoreData(CloudConnector.java:1097) at sailpoint.connector.cloud.CloudConnector$CloudBridgeIterator.hasNext(CloudConnector.java:1023) at sailpoint.connector.ConnectorProxy$CustomizingIterator.peek(ConnectorProxy.java:738) at sailpoint.connector.ConnectorProxy$CustomizingIterator.hasNext(ConnectorProxy.java:765) at com.sailpoint.mantis.qpoc.message.AccountAggregation.iterateResourceObjects(AccountAggregation.java:596) ... 29 more`

Regards,  
Jagadeep

---

<div class="post-metadata">

**Author:** ![philip-ellis](https://sea1.discourse-cdn.com/sailpoint/discuss/user_avatar/developer.sailpoint.com/philip-ellis/32/502_2.png) [@philip-ellis](https://developer.sailpoint.com/discuss/u/philip-ellis)\
**Post date:** [March 24, 2023, 2:00pm UTC](https://developer.sailpoint.com/discuss/t/saas-connectivity-building-your-first-connector/8142/7 "2023-03-24T14:00:10Z")

</div>

Hi Jagadeep,

It appears the data going to IDN is not in the right format. It’s probably something with how your airtable data is setup or your account mapping in the connector-spec.json. Are you able to share your connector-spec.json as well as the data as it appears in postman when you run locally?

---

<div class="post-metadata">

**Author:** ![jagadeepg](https://avatars.discourse-cdn.com/v4/letter/j/e9a140/32.png) [@jagadeepg](https://developer.sailpoint.com/discuss/u/jagadeepg)\
**Post date:** [March 24, 2023, 2:44pm UTC](https://developer.sailpoint.com/discuss/t/saas-connectivity-building-your-first-connector/8142/8 "2023-03-24T14:44:31Z")

</div>

Thanks for the prompt response.

JSON Output: std:account:list

```auto
{
    "identity": "recG4uQRt2rqqhEMQ",
    "attributes": {
        "id": "idn.user1",
        "email": "idn.user1@test.com",
        "fullname": "idn user1",
        "entitlements": "test"
    }
}
{
    "identity": "recgPwBo28D6sab4b",
    "attributes": {
        "id": "idn.test1",
        "email": "idn.test1@test.com",
        "fullname": "idn.test1",
        "entitlements": "read only"
    }
}

```

[connector-spec.json](https://developer.sailpoint.com/discuss/uploads/short-url/wQmxzXqgChWjHGWoQBqCsoZ6NOx.json) (2.4 KB)

---

<div class="post-metadata">

**Author:** ![philip-ellis](https://sea1.discourse-cdn.com/sailpoint/discuss/user_avatar/developer.sailpoint.com/philip-ellis/32/502_2.png) [@philip-ellis](https://developer.sailpoint.com/discuss/u/philip-ellis)\
**Post date:** [March 24, 2023, 5:51pm UTC](https://developer.sailpoint.com/discuss/t/saas-connectivity-building-your-first-connector/8142/9 "2023-03-24T17:51:46Z")

</div>

right away, I see what could be an issue. The entitlements should be an array. So the result should look like this:

```auto
{
    "identity": "recG4uQRt2rqqhEMQ",
    "attributes": {
        "id": "idn.user1",
        "email": "idn.user1@test.com",
        "fullname": "idn user1",
        "entitlements": ["test"]
    }
}

```

I’m not 100% sure that will cause a problem in your case, but it’s worth trying that change to see how it affects things.

---

<div class="post-metadata">

**Author:** ![jagadeepg](https://avatars.discourse-cdn.com/v4/letter/j/e9a140/32.png) [@jagadeepg](https://developer.sailpoint.com/discuss/u/jagadeepg)\
**Post date:** [March 27, 2023, 4:48pm UTC](https://developer.sailpoint.com/discuss/t/saas-connectivity-building-your-first-connector/8142/10 "2023-03-27T16:48:54Z")

</div>

I made entitlements multi value now. Postman result below:

```auto
{
    "identity": "recG4uQRt2rqqhEMQ",
    "attributes": {
        "id": "idn.user1",
        "email": "idn.user1@test.com",
        "fullname": "idn user1",
        "entitlements": [
            "test"
        ]
    }
}

```

But the problem is while running account aggregation in SailPoint.

Regards,  
Jagadeep
