Introductory walkthrough - Developer

We'll discuss these in more detail as part of updates, but for now you can think of them as: is a primary key for an asset: completely unique, but meaningless by itself is a business key for an asset: unique for a given kind of asset, and interpretable You can retrieve an asset using the static get() method on any asset type, providing the client and either the asset's GUID or qualifiedName. (Each asset type is its own unique class in the SDK.) You can retrieve an asset using the asset.get_by_guid() method on the Atlan client, providing both the type of asset you expect to retrieve and its GUID.


Introductory walkthrough - Developer

(Each asset type is its own unique class in the SDK.) You can also retrieve an asset using the asset.get_by_qualified_name() method on the Atlan client, providing the type of asset you expect to retrieve and its qualified_name. (Each asset type is its own unique class in the SDK.) You can retrieve an asset using the static get() method on any asset type, providing the client and either the asset's GUID or qualifiedName.


Introductory walkthrough - Developer

(Each asset type is its own unique class in the SDK.) You can retrieve an asset using the assets.GetByGuid() method on the Atlan client, providing both the type of asset you expect to retrieve and its GUID. (Each asset type is its own unique class in the SDK.) You can also retrieve an asset using the assets.GetByQualifiedName() method on the Atlan client, providing the type of asset you expect to retrieve and its qualifiedName.


Introductory walkthrough - Developer

(Each asset type is its own unique class in the SDK.) Note that the response is strongly typed: If you are retrieving a table, you will get a table back (as long as it exists). You do not need to figure out what properties or relationships exist on a table - the Table class defines them for for you already.


Introductory walkthrough - Developer

In any modern IDE, this means you have type-ahead support for retrieving the properties and relationships from the table variable. You can also refer to the types reference in this portal for full details of every kind of asset.


Introductory walkthrough - Developer

Retrieval by identifier can be more costly than you might expect Even though you are retrieving an asset by an identifier, this can be more costly than you might expect. Retrieving an asset in this way will: Retrieve all its properties and their values Retrieve all its relationships Imagine the asset you are retrieving has 100's or 1000's of these.


Introductory walkthrough - Developer

If you only care about its certificate and any owners, you will be retrieving far more information than you need. When you need to find it first For example, imagine you want to find all tables named MY_TABLE : You can then run the request using Execute().


Introductory walkthrough - Developer

For example, if you want to know the certificate of the asset you only need to tack that onto the query: Only this line differs from the original query. You can chain as many includeOnResults calls as you want to specify the properties and relationships you want to retrieve for matching assets.


Introductory walkthrough - Developer

Only this line differs from the original query. You can chain as many include_on_results calls as you want to specify the properties and relationships you want to retrieve for matching assets.


Introductory walkthrough - Developer

Only this line differs from the original query. You can chain as many includeOnResults calls as you want to specify the properties and relationships you want to retrieve for matching assets.


Introductory walkthrough - Developer

Only this line differs from the original query. You can include as many attributes in IncludeOnResults as you want to specify the properties and relationships you want to retrieve for matching assets.


Introductory walkthrough - Developer

Also gives the best performance If all you want to do is check or report on metadata, you should have a starting point from the information above. Or, now that you've found an asset of interest, maybe you want to update the asset with additional metadata?


Introductory walkthrough - Developer

Once again, before we jump to code, let's first understand some key concepts about how Atlan handles updates: Importance of identifiers Most operations on assets are upserts , that is, they could either create (insert) or update a given asset. How do you know which is going to happen?


Introductory walkthrough - Developer

To answer this question, you need to understand how Atlan uniquely identifies each asset. Recall earlier we discussed asset's different identifiers in Atlan.


Introductory walkthrough - Developer

Every asset in Atlan has at least the following two unique identifiers. These are both mandatory for every asset, so no asset can exist without these: Atlan uses globally-unique identifiers (GUIDs) to uniquely identify each asset, globally.


Introductory walkthrough - Developer

They look something like this: As the name implies, GUIDs are: Globally unique (across all systems). Generated in a way that makes it nearly impossible for anything else to ever generate that same ID.


Introductory walkthrough - Developer

2 Note that this means the GUID itself is not : Meaningful or capable of being interpreted in any way Atlan uses qualifiedName s to uniquely identify assets based on their characteristics. They look something like this: Qualified names are not : Globally unique (across all systems).


Introductory walkthrough - Developer

Instead, they are: Consistently constructed in a meaningful way, making it possible for them to be reconstructed. Note that this means the qualifiedName is: Meaningful and capable of being interpreted How these impact updates Since they are truly unique, operations that include a GUID will only update an asset, not create one.


Introductory walkthrough - Developer

Conversely, operations that take a qualifiedName can: Create an asset, if no exactly-matching qualifiedName is found in Atlan. Update an asset, if an exact-match for the qualifiedName is found in Atlan.


Introductory walkthrough - Developer

These operations also require a typeName , so that if creation does occur the correct type of asset is created. Unintended consequences of this behavior Be careful when using operations with only the qualifiedName.


Introductory walkthrough - Developer

You may end up creating assets when you were only expecting them to be updated or to fail if they did not already exist. This is particularly true when you do not give the exact, case-sensitive qualifiedName of an asset.


Introductory walkthrough - Developer

a/b/c/d is not the same as a/B/c/d when it comes to qualifiedName s. Perhaps this leaves you wondering: why have a qualifiedName at all?


Introductory walkthrough - Developer

The qualifiedName 's purpose is to identify what is a unique asset. Many different tools might all have information about that asset.


Introductory walkthrough - Developer

Having a common "identity" means that many different systems can each independently construct its identifier the same way. If a crawler gets table details from Snowflake it can upsert based on those identity characteristics in Atlan.


Introductory walkthrough - Developer

The crawler will not create duplicate tables every time it runs. This gives idempotency.


Introductory walkthrough - Developer

Looker knows the same identity characteristics for the Snowflake tables and columns. So if you get details from Looker about the tables it uses for reporting, you can link them together in lineage.


Introductory walkthrough - Developer

(Looker can construct the same identifier for the table as Snowflake itself.) These characteristics are not possible using GUIDs alone. Limit to changes only Now that you understand the nuances of identifiers, let's look at how you can update metadata in Atlan.


Introductory walkthrough - Developer

In general, you only need to send changes to Atlan. You do not need to send an entire asset each time you want to make changes to it.


Introductory walkthrough - Developer

For example, imagine you want to mark a table as certified but do not want to change anything else (its name, description, owner details, and so on): You can update an asset without first looking the asset up, if you know (can construct) its identifying qualifiedName. Using the updater() static method on any asset type, you pass in (typically) the qualifiedName and name of the asset.


Introductory walkthrough - Developer

This returns a builder onto which you can then chain any updates. You can then chain onto the returned builder as many updates as you want.


Introductory walkthrough - Developer

In this example, we change the certificate status to VERIFIED. At the end of your chain of updates, you need to build the builder (into an object, in-memory).


Introductory walkthrough - Developer

And then, finally, you need to .save() that object to persist those changes in Atlan (passing the client for the tenant you want to save it in). The response will contain details of the change: whether the asset was created, updated, or nothing happened because the asset already had those changes.


Introductory walkthrough - Developer

You can update an asset without first looking the asset up, if you know (can construct) its identifying qualified_name. Using the updater() class method on any asset type, you pass in (typically) the qualified_name and name of the asset.


Introductory walkthrough - Developer

You can then add onto the returned object as many updates as you want. In this example, we change the certificate status to VERIFIED.


Introductory walkthrough - Developer

And then, finally, you need to client.asset.save() that object to persist those changes in Atlan. The response will contain details of the change: whether the asset was created, updated, or nothing happened because the asset already had those changes.


Introductory walkthrough - Developer

You can update an asset without first looking the asset up, if you know (can construct) its identifying qualifiedName. Using the updater() static method on any asset type, you pass in (typically) the qualifiedName and name of the asset.


Introductory walkthrough - Developer


Introductory walkthrough - Developer

You can update an asset without first looking the asset up, if you know (can construct) its identifying qualifiedName. Using the Updater() method on any asset type, you pass in (typically) the qualifiedName and name of the asset.


Introductory walkthrough - Developer

This returns an object into which you can then place any updates. You can place into the returned object as many updates as you want.


Introductory walkthrough - Developer

In this example, we change the certificate status to VERIFIED. And then, finally, you need to .Save() that object to persist those changes in Atlan.


Introductory walkthrough - Developer

The response will contain details of the change: whether the asset was created, updated, or nothing happened because the asset already had those changes. Atlan will handle idempotency By sending only the changes you want to apply, Atlan can make idempotent updates.


Introductory walkthrough - Developer

Atlan will only attempt to update the asset with the changes you send. Atlan leaves any existing metadata on the asset as-is.


Introductory walkthrough - Developer

If the asset already has the metadata values you are sending, Atlan does nothing. It will not even update audit details like the last update timestamp, and is thus idempotent.


Introductory walkthrough - Developer

What if you want to make changes to many assets, as efficiently as possible? Start by initializing a batch.


Introductory walkthrough - Developer

Through this batch, we can automatically queue up and bulk-upsert assets — in this example, 20 at a time. Be sure to include any details you might need to make a decision about whether to update the asset or not (and what to update it with).


Introductory walkthrough - Developer

You must flush() the batch outside of any loop where you've added assets into it. This ensures any final remaining elements in the batch are still sent to Atlan, even if the batch is not "full".


Introductory walkthrough - Developer

Finally, from the batch you can retrieve the minimal details about any assets it created or updated. Start by initializing a batch.


Introductory walkthrough - Developer

You can then add() any updated objects directly into the batch you created earlier. The batch itself will handle saving these to Atlan when a sufficient number have been queued up (20, in this example).


Introductory walkthrough - Developer

Finally, from the batch you can retrieve the minimal details about any assets it created or updated. Where to go from here Common tasks Common operations on assets, that are available across all assets.


Introductory walkthrough - Developer

Discover actions Common operations on assets, that are available across all assets. Asset-specific Operations that are specific to certain assets.


Introductory walkthrough - Developer

Focus on a specific kind of asset Operations that are specific to certain assets. Focus on a specific kind of asset Governance structures Operations dealing with governance structures, rather than assets.


Introductory walkthrough - Developer

Manage governance structures Operations dealing with governance structures, rather than assets. Manage governance structures Samples Real code samples our customers use to solve particular use cases.


Introductory walkthrough - Developer

Review live samples Real code samples our customers use to solve particular use cases. Review live samples Events Delve deep into the details of the events Atlan triggers.


Introductory walkthrough - Developer

Learn more about events Delve deep into the details of the events Atlan triggers. Learn more about events Note that this is intentionally kept as simple as possible.


Introductory walkthrough - Developer

The walkthrough is not intended to be exhaustive. Where possible, we have cross-referenced other detailed examples elsewhere in the site.


Introductory walkthrough - Developer

↩ Note that this is intentionally kept as simple as possible. The walkthrough is not intended to be exhaustive.


Introductory walkthrough - Developer

Where possible, we have cross-referenced other detailed examples elsewhere in the site. ↩ There are orders of magnitude lower chances of GUIDs conflicting with each other than there are grains of sand on the planet.


Introductory walkthrough - Developer

(And generating them does not rely on a central ID-assigning registry.) ↩ There are orders of magnitude lower chances of GUIDs conflicting with each other than there are grains of sand on the planet. (And generating them does not rely on a central ID-assigning registry.) ↩


Introductory walkthrough - Developer

An introductory walkthrough You might also like our Atlan Platform Essentials certification. Not sure where to start?


Introductory walkthrough - Developer

Allow us to introduce Atlan development through example. 1 We strongly recommend using one of our SDKs to simplify the development process.


Introductory walkthrough - Developer

As a first step, set one up: The SDK is available on Maven Central , ready to be included in your project: Include the latest version of the Java SDK in your project as a dependency. You can also give a specific version instead of the + , if you'd like.


Introductory walkthrough - Developer

The Java SDK uses slf4j for logging purposes. You can include logback as a simple binding mechanism to send any logging information out to your console (standard out).


Introductory walkthrough - Developer

Provide two values to create an Atlan client: Provide your Atlan tenant URL as the first parameter. You can also read the value from an environment variable, if you leave out both parameters.


Introductory walkthrough - Developer

Provide your API token as the second parameter. You can also read the value from another environment variable, by leaving out this parameter.


Introductory walkthrough - Developer

You can then start writing some actual code to run within a static main method. (We'll show some examples of this further below.) Once the block is complete, any resources held by the client (i.e.


Introductory walkthrough - Developer

for caching) will be automatically released. Set up logging for SDK You can also checkout to the advanced configuration section of the SDK to learn about how to set up logging.


Introductory walkthrough - Developer

The SDK is available on PyPI. You can use pip to install it as follows: Provide two values to create an Atlan client: Provide your Atlan tenant URL to the base_url parameter.


Introductory walkthrough - Developer

(You can also do this through environment variables .) Provide your API token to the api_key parameter. (You can also do this through environment variables .) Set up logging for SDK You can also checkout to the advanced configuration section of the SDK to learn about how to set up logging.


Introductory walkthrough - Developer

The SDK is available on Maven Central , ready to be included in your project: Include the latest version of the Java SDK in your project as a dependency. You can also give a specific version instead of the + , if you'd like.


Introductory walkthrough - Developer

The Java SDK uses slf4j for logging purposes. You can include slf4j-simple as a simple binding mechanism to send any logging information out to your console (standard out), along with the kotlin-logging-jvm microutil.


Introductory walkthrough - Developer


Introductory walkthrough - Developer

The SDK is available on GitHub , ready to be included in your project: Provide two values to set up connectivity to Atlan: Provide your Atlan tenant URL to the assets.Context() method. If you prefer using the value from an environment variable, you can use assets.NewContext() without any parameters.


Introductory walkthrough - Developer

Provide your API token as the second parameter to the assets.Context() method. (Or again, have it picked up automatically by the assets.NewContext() method.) Set up logging for SDK You can also checkout to the advanced configuration section of the SDK to learn about how to set up logging.


Introductory walkthrough - Developer

Don't forget to give permissions If you want to be able to access existing metadata with an API token, don't forget that you need to assign one or more personas to the API token that grant it access to metadata. Now that you have an SDK installed and configured, you are ready to code!


Introductory walkthrough - Developer

Before we jump straight to code, though, let's first introduce some key concepts in Atlan: What is an asset? In Atlan, we refer to all objects that provide context to your data as assets.


Introductory walkthrough - Developer

Each type of asset in Atlan has a set of: Properties , such as: Certificates Announcements Properties , such as: Relationships to other assets, such as: Schema child tables Table parent schema Table child columns Column parent table Relationships to other assets, such as: Schema child tables Table parent schema Table child columns Column parent table In an object-oriented programming sense, think of an asset as an instance of a class. The structure of an asset (the class itself, in this analogy) is defined by something called a type definition , but that's for another day.


Introductory walkthrough - Developer

So as you can see: There are many different kinds of assets: tables, columns, schemas, databases, business intelligence dashboards, reports, and so on. Assets inter-relate with each other: a table has a parent schema and child columns, a schema has a parent database and child tables, and so on.


Introductory walkthrough - Developer

Different kinds of assets have some common properties (like certificates) and other properties that are unique to that kind of asset (like a columnCount that only exists on tables, not on schemas or databases). When you know the asset When you already know which asset you want to retrieve, you can read it from Atlan using one of its identifiers.


Introductory walkthrough - Developer

We'll discuss these in more detail as part of updates, but for now you can think of them as: is a primary key for an asset: completely unique, but meaningless by itself is a business key for an asset: unique for a given kind of asset, and interpretable You can retrieve an asset using the static get() method on any asset type, providing the client and either the asset's GUID or qualifiedName. (Each asset type is its own unique class in the SDK.) You can retrieve an asset using the asset.get_by_guid() method on the Atlan client, providing both the type of asset you expect to retrieve and its GUID.


Introductory walkthrough - Developer

(Each asset type is its own unique class in the SDK.) You can also retrieve an asset using the asset.get_by_qualified_name() method on the Atlan client, providing the type of asset you expect to retrieve and its qualified_name. (Each asset type is its own unique class in the SDK.) You can retrieve an asset using the static get() method on any asset type, providing the client and either the asset's GUID or qualifiedName.


Introductory walkthrough - Developer

(Each asset type is its own unique class in the SDK.) You can retrieve an asset using the assets.GetByGuid() method on the Atlan client, providing both the type of asset you expect to retrieve and its GUID. (Each asset type is its own unique class in the SDK.) You can also retrieve an asset using the assets.GetByQualifiedName() method on the Atlan client, providing the type of asset you expect to retrieve and its qualifiedName.


Introductory walkthrough - Developer

(Each asset type is its own unique class in the SDK.) Note that the response is strongly typed: If you are retrieving a table, you will get a table back (as long as it exists). You do not need to figure out what properties or relationships exist on a table - the Table class defines them for for you already.


Introductory walkthrough - Developer

In any modern IDE, this means you have type-ahead support for retrieving the properties and relationships from the table variable. You can also refer to the types reference in this portal for full details of every kind of asset.


Introductory walkthrough - Developer

Retrieval by identifier can be more costly than you might expect Even though you are retrieving an asset by an identifier, this can be more costly than you might expect. Retrieving an asset in this way will: Retrieve all its properties and their values Retrieve all its relationships Imagine the asset you are retrieving has 100's or 1000's of these.


Introductory walkthrough - Developer

If you only care about its certificate and any owners, you will be retrieving far more information than you need. When you need to find it first For example, imagine you want to find all tables named MY_TABLE : You can then run the request using Execute().


Introductory walkthrough - Developer

For example, if you want to know the certificate of the asset you only need to tack that onto the query: Only this line differs from the original query. You can chain as many includeOnResults calls as you want to specify the properties and relationships you want to retrieve for matching assets.


Introductory walkthrough - Developer

Only this line differs from the original query. You can chain as many include_on_results calls as you want to specify the properties and relationships you want to retrieve for matching assets.


Introductory walkthrough - Developer

Only this line differs from the original query. You can chain as many includeOnResults calls as you want to specify the properties and relationships you want to retrieve for matching assets.


Introductory walkthrough - Developer

Only this line differs from the original query. You can include as many attributes in IncludeOnResults as you want to specify the properties and relationships you want to retrieve for matching assets.


Introductory walkthrough - Developer

Also gives the best performance If all you want to do is check or report on metadata, you should have a starting point from the information above. Or, now that you've found an asset of interest, maybe you want to update the asset with additional metadata?


Introductory walkthrough - Developer

Once again, before we jump to code, let's first understand some key concepts about how Atlan handles updates: Importance of identifiers Most operations on assets are upserts , that is, they could either create (insert) or update a given asset. How do you know which is going to happen?


Introductory walkthrough - Developer

To answer this question, you need to understand how Atlan uniquely identifies each asset. Recall earlier we discussed asset's different identifiers in Atlan.


Introductory walkthrough - Developer

Every asset in Atlan has at least the following two unique identifiers. These are both mandatory for every asset, so no asset can exist without these: Atlan uses globally-unique identifiers (GUIDs) to uniquely identify each asset, globally.


Introductory walkthrough - Developer

They look something like this: As the name implies, GUIDs are: Globally unique (across all systems). Generated in a way that makes it nearly impossible for anything else to ever generate that same ID.


Introductory walkthrough - Developer

2 Note that this means the GUID itself is not : Meaningful or capable of being interpreted in any way Atlan uses qualifiedName s to uniquely identify assets based on their characteristics. They look something like this: Qualified names are not : Globally unique (across all systems).


Introductory walkthrough - Developer

Instead, they are: Consistently constructed in a meaningful way, making it possible for them to be reconstructed. Note that this means the qualifiedName is: Meaningful and capable of being interpreted How these impact updates Since they are truly unique, operations that include a GUID will only update an asset, not create one.


Introductory walkthrough - Developer

Conversely, operations that take a qualifiedName can: Create an asset, if no exactly-matching qualifiedName is found in Atlan. Update an asset, if an exact-match for the qualifiedName is found in Atlan.


Introductory walkthrough - Developer

These operations also require a typeName , so that if creation does occur the correct type of asset is created. Unintended consequences of this behavior Be careful when using operations with only the qualifiedName.


Introductory walkthrough - Developer

You may end up creating assets when you were only expecting them to be updated or to fail if they did not already exist. This is particularly true when you do not give the exact, case-sensitive qualifiedName of an asset.


Introductory walkthrough - Developer

a/b/c/d is not the same as a/B/c/d when it comes to qualifiedName s. Perhaps this leaves you wondering: why have a qualifiedName at all?


Introductory walkthrough - Developer

The qualifiedName 's purpose is to identify what is a unique asset. Many different tools might all have information about that asset.


Introductory walkthrough - Developer

Having a common "identity" means that many different systems can each independently construct its identifier the same way. If a crawler gets table details from Snowflake it can upsert based on those identity characteristics in Atlan.


Introductory walkthrough - Developer

The crawler will not create duplicate tables every time it runs. This gives idempotency.


Introductory walkthrough - Developer

Looker knows the same identity characteristics for the Snowflake tables and columns. So if you get details from Looker about the tables it uses for reporting, you can link them together in lineage.


Introductory walkthrough - Developer

(Looker can construct the same identifier for the table as Snowflake itself.) These characteristics are not possible using GUIDs alone. Limit to changes only Now that you understand the nuances of identifiers, let's look at how you can update metadata in Atlan.


Introductory walkthrough - Developer

In general, you only need to send changes to Atlan. You do not need to send an entire asset each time you want to make changes to it.


Introductory walkthrough - Developer

For example, imagine you want to mark a table as certified but do not want to change anything else (its name, description, owner details, and so on): You can update an asset without first looking the asset up, if you know (can construct) its identifying qualifiedName. Using the updater() static method on any asset type, you pass in (typically) the qualifiedName and name of the asset.


Introductory walkthrough - Developer

This returns a builder onto which you can then chain any updates. You can then chain onto the returned builder as many updates as you want.


Introductory walkthrough - Developer

In this example, we change the certificate status to VERIFIED. At the end of your chain of updates, you need to build the builder (into an object, in-memory).


Introductory walkthrough - Developer

And then, finally, you need to .save() that object to persist those changes in Atlan (passing the client for the tenant you want to save it in). The response will contain details of the change: whether the asset was created, updated, or nothing happened because the asset already had those changes.


Introductory walkthrough - Developer

You can update an asset without first looking the asset up, if you know (can construct) its identifying qualified_name. Using the updater() class method on any asset type, you pass in (typically) the qualified_name and name of the asset.


Introductory walkthrough - Developer

You can then add onto the returned object as many updates as you want. In this example, we change the certificate status to VERIFIED.


Introductory walkthrough - Developer

And then, finally, you need to client.asset.save() that object to persist those changes in Atlan. The response will contain details of the change: whether the asset was created, updated, or nothing happened because the asset already had those changes.


Introductory walkthrough - Developer

You can update an asset without first looking the asset up, if you know (can construct) its identifying qualifiedName. Using the updater() static method on any asset type, you pass in (typically) the qualifiedName and name of the asset.


Introductory walkthrough - Developer


Introductory walkthrough - Developer

You can update an asset without first looking the asset up, if you know (can construct) its identifying qualifiedName. Using the Updater() method on any asset type, you pass in (typically) the qualifiedName and name of the asset.


Introductory walkthrough - Developer

This returns an object into which you can then place any updates. You can place into the returned object as many updates as you want.


Introductory walkthrough - Developer

In this example, we change the certificate status to VERIFIED. And then, finally, you need to .Save() that object to persist those changes in Atlan.


Introductory walkthrough - Developer

The response will contain details of the change: whether the asset was created, updated, or nothing happened because the asset already had those changes. Atlan will handle idempotency By sending only the changes you want to apply, Atlan can make idempotent updates.


Introductory walkthrough - Developer

Atlan will only attempt to update the asset with the changes you send. Atlan leaves any existing metadata on the asset as-is.


Introductory walkthrough - Developer

If the asset already has the metadata values you are sending, Atlan does nothing. It will not even update audit details like the last update timestamp, and is thus idempotent.


Introductory walkthrough - Developer

What if you want to make changes to many assets, as efficiently as possible? Start by initializing a batch.


Introductory walkthrough - Developer

Through this batch, we can automatically queue up and bulk-upsert assets — in this example, 20 at a time. Be sure to include any details you might need to make a decision about whether to update the asset or not (and what to update it with).


Introductory walkthrough - Developer

You must flush() the batch outside of any loop where you've added assets into it. This ensures any final remaining elements in the batch are still sent to Atlan, even if the batch is not "full".


Introductory walkthrough - Developer

Finally, from the batch you can retrieve the minimal details about any assets it created or updated. Start by initializing a batch.


Introductory walkthrough - Developer

You can then add() any updated objects directly into the batch you created earlier. The batch itself will handle saving these to Atlan when a sufficient number have been queued up (20, in this example).


Introductory walkthrough - Developer

Finally, from the batch you can retrieve the minimal details about any assets it created or updated. Where to go from here Common tasks Common operations on assets, that are available across all assets.


Introductory walkthrough - Developer

Discover actions Common operations on assets, that are available across all assets. Asset-specific Operations that are specific to certain assets.


Introductory walkthrough - Developer

Focus on a specific kind of asset Operations that are specific to certain assets. Focus on a specific kind of asset Governance structures Operations dealing with governance structures, rather than assets.


Introductory walkthrough - Developer

Manage governance structures Operations dealing with governance structures, rather than assets. Manage governance structures Samples Real code samples our customers use to solve particular use cases.


Introductory walkthrough - Developer

Review live samples Real code samples our customers use to solve particular use cases. Review live samples Events Delve deep into the details of the events Atlan triggers.


Introductory walkthrough - Developer

Learn more about events Delve deep into the details of the events Atlan triggers. Learn more about events Note that this is intentionally kept as simple as possible.


Introductory walkthrough - Developer

The walkthrough is not intended to be exhaustive. Where possible, we have cross-referenced other detailed examples elsewhere in the site.


Introductory walkthrough - Developer

↩ Note that this is intentionally kept as simple as possible. The walkthrough is not intended to be exhaustive.


Introductory walkthrough - Developer

Where possible, we have cross-referenced other detailed examples elsewhere in the site. ↩ There are orders of magnitude lower chances of GUIDs conflicting with each other than there are grains of sand on the planet.


Introductory walkthrough - Developer

(And generating them does not rely on a central ID-assigning registry.) ↩ There are orders of magnitude lower chances of GUIDs conflicting with each other than there are grains of sand on the planet. (And generating them does not rely on a central ID-assigning registry.) ↩


Integration options - Developer

Throughout the portal you can focus on your preferred integration approach (and switch between them as you like): CLI Use the Atlan CLI to manage data contracts for assets in Atlan. Get started with CLI Use the Atlan CLI to manage data contracts for assets in Atlan.


Integration options - Developer

Get started with CLI dbt Use dbt's meta field to enrich metadata resources straight from dbt into Atlan. Get started with dbt Use dbt's meta field to enrich metadata resources straight from dbt into Atlan.


Integration options - Developer

Get started with dbt Java Pull our Java SDK from Maven Central, just like any other dependency. Get started with Java Pull our Java SDK from Maven Central, just like any other dependency.


Integration options - Developer

Get started with Java Python Pull our Python SDK from PyPI, just like any other dependency. Get started with Python Pull our Python SDK from PyPI, just like any other dependency.


Integration options - Developer

Get started with Python Kotlin Pull our Java SDK from Maven Central, just like any other dependency. Get started with Kotlin Pull our Java SDK from Maven Central, just like any other dependency.


Integration options - Developer

Get started with Kotlin Scala Pull our Java SDK from Maven Central, just like any other dependency. Get started with Scala Pull our Java SDK from Maven Central, just like any other dependency.


Integration options - Developer

Get started with Scala Clojure Pull our Java SDK from Maven Central, just like any other dependency. Get started with Clojure Pull our Java SDK from Maven Central, just like any other dependency.


Integration options - Developer

Get started with Clojure Go Pull our Go SDK from GitHub, just like any other dependency. Get started with Go Pull our Go SDK from GitHub, just like any other dependency.


Integration options - Developer

Get started with Go Events Tap into events Atlan produces to take immediate action, as metadata changes. Get started with events Tap into events Atlan produces to take immediate action, as metadata changes.


Integration options - Developer

Get started with events Raw REST API You can call directly into our REST API, though we would recommend the SDKs. Get started with raw REST APIs Raw REST API You can call directly into our REST API, though we would recommend the SDKs.


Integration options - Developer

Get started with raw REST APIs


Atlan CLI - Developer

Limited functionality (so far) You can use Atlan's command-line interface (CLI) to manage some metadata in Atlan. Currently data contracts and metadata for a limited set of asset types can be managed through the CLI.


Atlan CLI - Developer

Obtain the CLI For now, the CLI must be downloaded as a pre-built binary: Disclaimer — closed preview When installed via Homebrew, you can easily keep things up-to-date. If you do not use it already, see Homebrew's own installation documents for setting up Homebrew itself.


Atlan CLI - Developer

Configure the CLI You can configure the CLI using a config file or in some cases environment variables, with the following minimum settings 1 : An API token that has access to your assets. The base URL of your tenant (including the https:// ).


Atlan CLI - Developer

(Optional) Enable logging to produce more details on what the CLI is doing. When logging is enabled, specify the level of verbosity.


Atlan CLI - Developer

An API token that has access to your assets. Define data sources You should also define data sources in the config file: Each data source definition must start with data_source , followed by a space and a unique reference name for the data source ( snowflake in this example).


Atlan CLI - Developer

Reference name is your choice The reference name you give in the configuration file is only used here and as a reference in any data contracts you define. It need not match the name of the connection or data source in Atlan itself.


Atlan CLI - Developer

Each data source definition must start with data_source , followed by a space and a unique reference name for the data source ( snowflake in this example). Reference name is your choice The reference name you give in the configuration file is only used here and as a reference in any data contracts you define.


Atlan CLI - Developer

It need not match the name of the connection or data source in Atlan itself. You must indicate the type of connector for the data source (see connector types for options).


Atlan CLI - Developer

You must indicate the type of connector for the data source (see connector types for options). Details of the connection must also be provided.


Atlan CLI - Developer

You must provide the name of the connection, as it appears in Atlan. You must provide the unique qualified_name of the connection in Atlan.


Atlan CLI - Developer

(Optional) You can also specify the database to use for this connection's assets by default, if none is specified in the data contract. (Optional) You can also specify the schema to use for this connection's assets by default, if none is specified in the data contract.


Atlan CLI - Developer

These ensure the CLI can map the details you specify in your data contract to the appropriate corresponding asset in Atlan. With the CLI, you can: Manage data contracts Upload and download files from Atlan's backing object store Sync metadata to a limited set of asset types Integrate data contracts with CI/CD processing When both are specified, environment variables will take precedence.


Atlan CLI - Developer

↩ When both are specified, environment variables will take precedence. ↩


dbt - Developer

See it in action in our automated enrichment course (45 mins). You can use dbt's meta field to enrich metadata resources from dbt into Atlan.


dbt - Developer

Atlan will ingest the information from this field and update the assets in Atlan accordingly. With this, you have a powerful way to keep the dbt assets documented directly as part of your dbt work.


dbt - Developer

The following is an example: The description at the top level of an asset defined in dbt will already be mapped to the description field for that asset in Atlan. More detailed metadata, however, needs to be specified within the meta field.


dbt - Developer

. and within the meta field, further within the atlan sub-field.


dbt - Developer

For attributes, such as certificates, announcements, or owners these need to be specified within the attributes sub-field. Classifications need to be specified within a classifications sub-field.


dbt - Developer

Note that the meta field and its sub-structure (including all the detailed attributes) can also be applied to columns within a model. This rich metadata will then be loaded to the corresponding attributes on the asset in Atlan.


dbt - Developer

For more details on specific examples, see the dbt tabs in the Common asset actions snippets.


Java SDK - Developer

Walk through step-by-step in our intro to custom integration course (30 mins). Obtain the SDK The SDK is available on Maven Central, ready to be included in your project: Include the latest version of the Java SDK in your project as a dependency.


Java SDK - Developer

You can also give a specific version instead of the + , if you'd like. The Java SDK uses slf4j for logging purposes.


Java SDK - Developer

You can include logback as a simple binding mechanism to send any logging information out to your console (standard out), at INFO -level or above. Configure the SDK There are two ways to configure the SDK: Using environment variables ATLAN_API_KEY should be given your Atlan API token , for authentication ( don't forget to assign one or more personas to the API token to give access to existing assets!


Java SDK - Developer

) ATLAN_BASE_URL should be given your Atlan URL (for example, https://tenant.atlan.com ) Here's an example of setting those environment variables: On client creation If you prefer to not use environment variables, you can do the following: Careful not to expose your API token! We generally discourage including your API token directly in your code, in case you accidentally commit it into a (public) version control system.


Java SDK - Developer

But it's your choice exactly how you manage the API token and including it for use within the client. (Note that you can also explicity provide only the tenant URL, and the constructor will look for only the API key through an environment variable.) That's it — once these are set you can start using your SDK to make live calls against your Atlan instance!


Java SDK - Developer

🎉 Delve into more detailed examples: Common tasks Common operations on assets, that are available across all assets. Discover actions Common operations on assets, that are available across all assets.


Java SDK - Developer

Asset-specific Operations that are specific to certain assets. Focus on a specific kind of asset Operations that are specific to certain assets.


Java SDK - Developer

Focus on a specific kind of asset Governance structures Operations dealing with governance structures, rather than assets. Manage governance structures Operations dealing with governance structures, rather than assets.


Java SDK - Developer

Manage governance structures Samples Real code samples our customers use to solve particular use cases. Review live samples Real code samples our customers use to solve particular use cases.


Java SDK - Developer

Review live samples Events Delve deep into the details of the events Atlan triggers. Learn more about events Delve deep into the details of the events Atlan triggers.


Java SDK - Developer

Learn more about events The SDK defines checked exceptions for the following categories of error: A given API call could fail due to all of the errors above. So these all extend a generic AtlanException checked exception, and all API operations throw AtlanException.


Java SDK - Developer

For example, when creating a connection there is an asynchronous process that grants permissions to the admins of that connection. So there can be a slight delay between creating the connection and being permitted to do any operations with the connection.


Java SDK - Developer

During that delay, any attempt to interact with the connection will result in a PermissionException , even if your API token was used to create connection in the first place. Another example you may occasionally hit is some network issue that causes your connection to Atlan to be interrupted.


Java SDK - Developer

In these cases, an ApiConnectionException will be raised. Don't worry, the SDK retries automatically While these are useful to know for detecting issues, the SDK automatically retries on such problems.


Java SDK - Developer

Atlan is a distributed, cloud-native application, where network problems can arise. These advanced configuration options allow you to optimize how the SDK handles such ephemeral problems.


Java SDK - Developer

The SDK uses slf4j to be logging framework-agnostic. You can therefore configure your own preferred logging framework: Replace the ch.qos.logback:logback-classic:1.2.11 logback binding with log4j2 bindings.


Java SDK - Developer

The SDK handles automatically retrying your requests when it detects certain problems: When an ApiConnectionException occurs that is caused by an underlying ConnectException or SocketTimeoutException. When there is a 403 response indicating that permission for an operation is not (yet) available.


Java SDK - Developer

When there is a 500 response indicating that something went wrong on the server side. If any request encounters one of these problems, it will be retried.


Java SDK - Developer

Before each retry, the SDK will apply a delay using: An exponential backoff (starting from 500ms) A jitter (in the range of 75-100% of the backoff delay) Each retry will be at least 500ms, and at most 5s. (Currently these values are not configurable.) For each request that encounters any of these problems, only up to a maximum number of retries will be attempted.


Java SDK - Developer

(This is set to 3 by default.) You can configure the maximum number of retries globally using setMaxNetworkRetries() on a client. Set this to an integer: The SDK will only wait so long for a response before assuming a network problem has occurred and the request should be timed out.


Java SDK - Developer

By default, this is set to 80 seconds. You can configure the maximum time the SDK will wait before timing out a request using setReadTimeout() on a client.


Java SDK - Developer

Set this to an integer giving the number of milliseconds before timing out: Remember this must be given in milliseconds. This example sets the timeout to 2 minutes (120 seconds * 1000 milliseconds).


Java SDK - Developer

Since version 0.9.0, the Java SDK supports connecting to multiple tenants. From version 4.0.0 onwards you can create any number of clients against any number of different tenants, since every operation that interacts with a tenant now explicitly requires a client to be provided to it: Constructing a new client with a different tenant's URL is sufficient to create connectivity to that other tenant.


Java SDK - Developer

You can also (optionally) provide a second argument to directly give the API token for the tenant. Create an object as usual.


Java SDK - Developer

You can access the operations for assets directly on the client, under client.assets. These will generally give you the most flexibility — they can handle multiple objects at a time and allow overrides.


Java SDK - Developer

Every operation on the client itself has a variant with an (optional) final argument through which you can override settings like retry limits or timeouts for this single request. You can use the from(client) factory method to initialize the request options with all the settings of your client, and then you only need to chain on those you want to override for this particular request.


Java SDK - Developer

Alternatively, you can pass the client to the operation on the object itself. Limit the number of clients to those you must have Each client you create maintains its own independent copy of various caches.


Java SDK - Developer

So the more clients you have, the more resources your code will consume. For this reason, we recommended limiting the number of clients you create to the bare minimum you require — ideally just a single client per tenant.


Java SDK - Developer

Using a proxy To use the Java SDK with a proxy, you need to send in some additional parameters when running any java. command.


Java SDK - Developer

These are described in detail in the Java documentation , but are summarized here for simplicity: socksProxyHost should be set to the hostname for your SOCKS proxy socksProxyPort should be set to the port for your SOCKS proxy (default being 1080) Providing credentials to the proxy In either case, if you need to authenticate to your proxy, you will need to wrap whatever code you want to run to set up these credentials using something like the following: You need to create a built-in Java PasswordAuthentication object. Provide your username as the first argument.


Java SDK - Developer

. and your password as the second argument, as a char[].


Java SDK - Developer

(Of course, you should not hard-code your password in your code itself, but rather pull it from elsewhere.) Then use setProxyCredential() to pass this PasswordAuthentication object to the Atlan client, before any of the rest of the code will execute.


Python SDK - Developer

Walk through step-by-step in our intro to custom integration course (30 mins). Obtain the SDK The SDK is currently available on pypi.


Python SDK - Developer

You can use pip to install it as follows: Configure the SDK There are two ways to configure the SDK: Using environment variables ATLAN_API_KEY should be given your Atlan API token , for authentication ( don't forget to assign one or more personas to the API token to give access to existing assets! ) ATLAN_BASE_URL should be given your Atlan URL (for example, https://tenant.atlan.com ) Here's an example of setting those environment variables: On client creation If you prefer to not use environment variables, you can do the following: Careful not to expose your API token!


Python SDK - Developer

We generally discourage including your API token directly in your code, in case you accidentally commit it into a (public) version control system. But it's your choice exactly how you manage the API token and including it for use within the client.


Python SDK - Developer

In some scenarios, you may not want to expose the entire API token or manage environment variables. Instead, you can provide the GUID of the API token, and the SDK will internally fetch the actual access token.


Python SDK - Developer

When to use this approach: Building apps that use the SDK where token security is a concern When you want to avoid exposing full API tokens in your configuration For containerized applications that need secure token management Before using this approach, ensure your Argo template is configured with CLIENT_ID and CLIENT_SECRET : Create client from token GUID : Use AtlanClient.from_token_guid() to create a client using the GUID of an API token. The SDK will automatically fetch the actual access token using the configured CLIENT_ID and CLIENT_SECRET.


Python SDK - Developer

That's it — once these are set you can start using your SDK to make live calls against your Atlan instance! 🎉 Delve into more detailed examples: Common tasks Common operations on assets, that are available across all assets.


Python SDK - Developer

Discover actions Common operations on assets, that are available across all assets. Asset-specific Operations that are specific to certain assets.


Python SDK - Developer

Focus on a specific kind of asset Operations that are specific to certain assets. Focus on a specific kind of asset Governance structures Operations dealing with governance structures, rather than assets.


Python SDK - Developer

Manage governance structures Operations dealing with governance structures, rather than assets. Manage governance structures Samples Real code samples our customers use to solve particular use cases.


Python SDK - Developer

Review live samples Real code samples our customers use to solve particular use cases. Review live samples Events Delve deep into the details of the events Atlan triggers.


Python SDK - Developer

Learn more about events Delve deep into the details of the events Atlan triggers. Learn more about events The SDK defines exceptions for the following categories of error: A given API call could fail due to all of the errors above.


Python SDK - Developer

So these all extend a generic AtlanError exception, and all API operations can potentially raise AtlanError. For example, when creating a connection there is an asynchronous process that grants permissions to the admins of that connection.


Python SDK - Developer

So there can be a slight delay between creating the connection and being permitted to do any operations with the connection. During that delay, any attempt to interact with the connection will result in a PermissionError , even if your API token was used to create connection in the first place.


Python SDK - Developer

Another example you may occasionally hit is some network issue that causes your connection to Atlan to be interrupted. In these cases, an ApiConnectionError will be raised.


Python SDK - Developer

Don't worry, the SDK retries automatically While these are useful to know for detecting issues, the SDK automatically retries on such problems. Atlan is a distributed, cloud-native application, where network problems can arise.


Python SDK - Developer

The SDK therefore automatically attempts to handle ephemeral problems. The SDK uses logging module of the standard library that can provide a flexible framework for emitting log messages.


Python SDK - Developer

You can enable logging for your SDK script by adding the following lines above your snippets: You can enable logging by using basicConfig with various logging levels: logging.DEBUG : used to give detailed information, typically of interest only when diagnosing problems (mostly used level in SDK). logging.INFO : used to confirm that things are working as expected.


Python SDK - Developer

logging.WARN : used as an indication that something unexpected happened, or as a warning of some problem in the near future. logging.ERROR : indicates that due to a more serious problem, the SDK has not been able to perform some operation.


Python SDK - Developer

logging.CRITICAL : indicates a serious error, suggesting that the program itself may be unable to continue running (not used in SDK as of now). You can enable logging by using basicConfig with various logging levels: logging.DEBUG : used to give detailed information, typically of interest only when diagnosing problems (mostly used level in SDK).


Python SDK - Developer

logging.INFO : used to confirm that things are working as expected. logging.WARN : used as an indication that something unexpected happened, or as a warning of some problem in the near future.


Python SDK - Developer

logging.ERROR : indicates that due to a more serious problem, the SDK has not been able to perform some operation. logging.CRITICAL : indicates a serious error, suggesting that the program itself may be unable to continue running (not used in SDK as of now).


Python SDK - Developer

By default, logs will appear in your console. If you want to use file logging, you can add the following line: logging.config.fileConfig('pyatlan/logging.conf') : this will generate logs according to the configuration defined in pyatlan/logging.conf and will generate two log files: /tmp/pyatlan.log : default log file.


Python SDK - Developer

/tmp/pyatlan.json : log file in JSON format. By default, logs will appear in your console.


Python SDK - Developer

If you want to use file logging, you can add the following line: logging.config.fileConfig('pyatlan/logging.conf') : this will generate logs according to the configuration defined in pyatlan/logging.conf and will generate two log files: /tmp/pyatlan.log : default log file. /tmp/pyatlan.json : log file in JSON format.


Python SDK - Developer

logging.config.fileConfig('pyatlan/logging.conf') : this will generate logs according to the configuration defined in pyatlan/logging.conf and will generate two log files: /tmp/pyatlan.log : default log file. /tmp/pyatlan.json : log file in JSON format.


Python SDK - Developer

The SDK handles automatically retrying your requests when it detects certain problems: When there is a 403 response indicating that permission for an operation is not (yet) available. When there is a 429 response indicating that the request rate limit has been exceeded, and you need to retry after some time.


Python SDK - Developer

When there is a 50x response indicating that something went wrong on the server side. If any request encounters one of these problems, it will be retried.


Python SDK - Developer

Before each retry, the SDK will apply a delay using an exponential backoff. (Currently the values for the exponential backoff are not configurable.) For each request that encounters any of these problems, only up to a maximum number of retries will be attempted.


Python SDK - Developer

(This is set to 5 by default.) By default, the SDK AtlanClient() has the following timeout settings: read_timeout : 900.0 seconds ( 15 minutes) connect_timeout : 30.0 seconds If you need to override these defaults, you can do so as shown in the example below: Since version 1.0.0, the Python SDK supports connecting to multiple tenants.[^1] When you use the AtlanClient() method you are actually setting a default client. This default client will be used behind-the-scenes for any operations that need information specific to an Atlan tenant.


Python SDK - Developer

When you want to override that default client you can create a new one and use the set_default_client() method to change it: The AtlanClient() method will return a client for the given base URL, creating a new client and setting this new client as the default client. If you want to switch between clients that you have already created, you can use Atlan.set_default_client() to change between them.


Python SDK - Developer

Limit the number of clients to those you must have Each client you create maintains its own independent copy of various caches. So the more clients you have, the more resources your code will consume.


Python SDK - Developer

For this reason, we recommended limiting the number of clients you create to the bare minimum you require — ideally just a single client per tenant. (And since in the majority of use cases you only need access to a single tenant, this means you can most likely just rely on the default client and the fallback behavior.) Pyatlan uses the Requests library which supports proxy configuration via environment variables.


Python SDK - Developer

Requests relies on the proxy configuration defined by standard environment variables http_proxy, https_proxy, no_proxy, and all_proxy. Uppercase variants of these variables are also supported.


Python SDK - Developer

You can therefore set them to configure Pyatlan (only set the ones relevant to your needs): To use HTTP Basic Auth with your proxy, use the http://user:password@host/ syntax in any of the above configuration entries: Currently, the way this is implemented limits you to either avoiding multiple threads in your Python code (if you need to use multiple clients), or if you want to use multiple threads you should only use a single client. Asynchronous SDK operations To get started, you need to initialize an AsyncAtlanClient : Create an async client using the same configuration pattern as the synchronous client.


Python SDK - Developer

Concurrent operations for improved performance The real power of async comes from running multiple operations concurrently. Instead of waiting for each operation to complete sequentially, you can execute them in parallel and reduce total execution time: Synchronous : Total time = operation₁ + operation₂ +.


Python SDK - Developer

+ operationₙ Asynchronous : Total time = max(operation₁, operation₂,. , operationₙ) When to use async Async is most beneficial when you have: Multiple independent operations that can run concurrently I/O-heavy workloads like API calls, database queries, or file operations Long-running operations where parallelization provides significant time savings For simple, single operations, the synchronous client may be more straightforward to use.


Kotlin SDK - Developer

Obtain the SDK For Kotlin, you can reuse the existing Java SDK as-is. It is available on Maven Central, ready to be included in your project: Include the latest version of the Java SDK in your project as a dependency.


Kotlin SDK - Developer

You can also give a specific version instead of the + , if you'd like. The Java SDK uses slf4j for logging purposes.


Kotlin SDK - Developer

You can include slf4j-simple as a simple binding mechanism to send any logging information out to your console (standard out), along with the kotlin-logging-jvm microutil. Configure the SDK There are two ways to configure the SDK: Using environment variables ATLAN_API_KEY should be given your Atlan API token , for authentication ( don't forget to assign one or more personas to the API token to give access to existing assets!


Kotlin SDK - Developer

) ATLAN_BASE_URL should be given your Atlan URL (for example, https://tenant.atlan.com ) Here's an example of setting those environment variables: On client creation If you prefer to not use environment variables, you can do the following: Delve into more detailed examples: Common tasks Common operations on assets, that are available across all assets. Discover actions Common operations on assets, that are available across all assets.


Kotlin SDK - Developer

Asset-specific Operations that are specific to certain assets. Focus on a specific kind of asset Operations that are specific to certain assets.


Kotlin SDK - Developer

Focus on a specific kind of asset Governance structures Operations dealing with governance structures, rather than assets. Manage governance structures Operations dealing with governance structures, rather than assets.


Kotlin SDK - Developer

Manage governance structures Samples Real code samples our customers use to solve particular use cases. Review live samples Real code samples our customers use to solve particular use cases.


Kotlin SDK - Developer

Review live samples Events Delve deep into the details of the events Atlan triggers. Learn more about events Delve deep into the details of the events Atlan triggers.


Kotlin SDK - Developer

Learn more about events The SDK defines checked exceptions for the following categories of error: A given API call could fail due to all of the errors above. So these all extend a generic AtlanException checked exception, and all API operations throw AtlanException.


Kotlin SDK - Developer

For example, when creating a connection there is an asynchronous process that grants permissions to the admins of that connection. So there can be a slight delay between creating the connection and being permitted to do any operations with the connection.


Kotlin SDK - Developer

During that delay, any attempt to interact with the connection will result in a PermissionException , even if your API token was used to create connection in the first place. Another example you may occasionally hit is some network issue that causes your connection to Atlan to be interrupted.


Kotlin SDK - Developer

In these cases, an ApiConnectionException will be raised. Don't worry, the SDK retries automatically While these are useful to know for detecting issues, the SDK automatically retries on such problems.


Kotlin SDK - Developer

Atlan is a distributed, cloud-native application, where network problems can arise. These advanced configuration options allow you to optimize how the SDK handles such ephemeral problems.


Kotlin SDK - Developer

The SDK uses slf4j to be logging framework-agnostic. You can therefore configure your own preferred logging framework: Replace the org.slf4j:slf4j-simple:2.0.7 binding with log4j2 bindings.


Kotlin SDK - Developer

The SDK handles automatically retrying your requests when it detects certain problems: When an ApiConnectionException occurs that is caused by an underlying ConnectException or SocketTimeoutException. When there is a 403 response indicating that permission for an operation is not (yet) available.


Kotlin SDK - Developer

When there is a 500 response indicating that something went wrong on the server side. If any request encounters one of these problems, it will be retried.


Kotlin SDK - Developer

Before each retry, the SDK will apply a delay using: An exponential backoff (starting from 500ms) A jitter (in the range of 75-100% of the backoff delay) Each retry will be at least 500ms, and at most 5s. (Currently these values are not configurable.) For each request that encounters any of these problems, only up to a maximum number of retries will be attempted.


Kotlin SDK - Developer

(This is set to 3 by default.) You can configure the maximum number of retries globally using setMaxNetworkRetries() on a client. Set this to an integer: The SDK will only wait so long for a response before assuming a network problem has occurred and the request should be timed out.


Kotlin SDK - Developer

By default, this is set to 80 seconds. You can configure the maximum time the SDK will wait before timing out a request using setReadTimeout() on a client.


Kotlin SDK - Developer

Set this to an integer giving the number of milliseconds before timing out: Remember this must be given in milliseconds. This example sets the timeout to 2 minutes (120 seconds * 1000 milliseconds).


Kotlin SDK - Developer

Since version 0.9.0, the Java SDK supports connecting to multiple tenants. From version 4.0.0 onwards you can create any number of clients against any number of different tenants, since every operation that interacts with a tenant now explicitly requires a client to be provided to it: Constructing a new client with a different tenant's URL is sufficient to create connectivity to that other tenant.


Kotlin SDK - Developer

You can also (optionally) provide a second argument to directly give the API token for the tenant. Create an object as usual.


Kotlin SDK - Developer

You can access the operations for assets directly on the client, under client.assets. These will generally give you the most flexibility — they can handle multiple objects at a time and allow overrides.


Kotlin SDK - Developer

Every operation on the client itself has a variant with an (optional) final argument through which you can override settings like retry limits or timeouts for this single request. You can use the from(client) factory method to initialize the request options with all the settings of your client, and then you only need to chain on those you want to override for this particular request.


Kotlin SDK - Developer

Alternatively, you can pass the client to the operation on the object itself. Limit the number of clients to those you must have Each client you create maintains its own independent copy of various caches.


Kotlin SDK - Developer

So the more clients you have, the more resources your code will consume. For this reason, we recommended limiting the number of clients you create to the bare minimum you require — ideally just a single client per tenant.


Kotlin SDK - Developer

Using a proxy To use the Java SDK with a proxy, you need to send in some additional parameters when running any java. command.


Kotlin SDK - Developer

These are described in detail in the Java documentation , but are summarized here for simplicity: socksProxyHost should be set to the hostname for your SOCKS proxy socksProxyPort should be set to the port for your SOCKS proxy (default being 1080) Providing credentials to the proxy In either case, if you need to authenticate to your proxy, you will need to wrap whatever code you want to run to set up these credentials using something like the following: You need to create a built-in Java PasswordAuthentication object. Provide your username as the first argument.


Kotlin SDK - Developer

. and your password as the second argument, as a char[].


Kotlin SDK - Developer

(Of course, you should not hard-code your password in your code itself, but rather pull it from elsewhere.) Then use setProxyCredential() to pass this PasswordAuthentication object to the Atlan client, before any of the rest of the code will execute.


Scala SDK - Developer

Obtain the SDK For Scala, you can reuse the existing Java SDK as-is. It is available on Maven Central, ready to be included in your project: Include the latest version of the Java SDK in your project as a dependency (replace the version number with the latest version indicated in the badges above).


Scala SDK - Developer

The Java SDK uses slf4j for logging purposes. You can include the scala-logging utility as a simple binding mechanism to send any logging information out to your console (standard out).


Scala SDK - Developer

Configure the SDK There are two ways to configure the SDK: Using environment variables ATLAN_API_KEY should be given your Atlan API token , for authentication ( don't forget to assign one or more personas to the API token to give access to existing assets! ) ATLAN_BASE_URL should be given your Atlan URL (for example, https://tenant.atlan.com ) Here's an example of setting those environment variables: On client creation If you prefer to not use environment variables, you can do the following: Delve into more detailed examples: Common tasks Common operations on assets, that are available across all assets.


Scala SDK - Developer

Discover actions Common operations on assets, that are available across all assets. Asset-specific Operations that are specific to certain assets.


Scala SDK - Developer

Focus on a specific kind of asset Operations that are specific to certain assets. Focus on a specific kind of asset Governance structures Operations dealing with governance structures, rather than assets.


Scala SDK - Developer

Manage governance structures Operations dealing with governance structures, rather than assets. Manage governance structures Samples Real code samples our customers use to solve particular use cases.


Scala SDK - Developer

Review live samples Real code samples our customers use to solve particular use cases. Review live samples Events Delve deep into the details of the events Atlan triggers.


Scala SDK - Developer

Learn more about events Delve deep into the details of the events Atlan triggers. Learn more about events The SDK defines checked exceptions for the following categories of error: A given API call could fail due to all of the errors above.


Scala SDK - Developer

So these all extend a generic AtlanException checked exception, and all API operations throw AtlanException. For example, when creating a connection there is an asynchronous process that grants permissions to the admins of that connection.


Scala SDK - Developer

So there can be a slight delay between creating the connection and being permitted to do any operations with the connection. During that delay, any attempt to interact with the connection will result in a PermissionException , even if your API token was used to create connection in the first place.


Scala SDK - Developer

Another example you may occasionally hit is some network issue that causes your connection to Atlan to be interrupted. In these cases, an ApiConnectionException will be raised.


Scala SDK - Developer

Don't worry, the SDK retries automatically While these are useful to know for detecting issues, the SDK automatically retries on such problems. Atlan is a distributed, cloud-native application, where network problems can arise.


Scala SDK - Developer

These advanced configuration options allow you to optimize how the SDK handles such ephemeral problems. The SDK uses slf4j to be logging framework-agnostic.


Scala SDK - Developer

You can therefore configure your own preferred logging framework: Add log4j2 bindings. The SDK handles automatically retrying your requests when it detects certain problems: When an ApiConnectionException occurs that is caused by an underlying ConnectException or SocketTimeoutException.


Scala SDK - Developer

When there is a 403 response indicating that permission for an operation is not (yet) available. When there is a 500 response indicating that something went wrong on the server side.


Scala SDK - Developer

If any request encounters one of these problems, it will be retried. Before each retry, the SDK will apply a delay using: An exponential backoff (starting from 500ms) A jitter (in the range of 75-100% of the backoff delay) Each retry will be at least 500ms, and at most 5s.


Scala SDK - Developer

(Currently these values are not configurable.) For each request that encounters any of these problems, only up to a maximum number of retries will be attempted. (This is set to 3 by default.) You can configure the maximum number of retries globally using setMaxNetworkRetries() on a client.


Scala SDK - Developer

Set this to an integer: The SDK will only wait so long for a response before assuming a network problem has occurred and the request should be timed out. By default, this is set to 80 seconds.


Scala SDK - Developer

You can configure the maximum time the SDK will wait before timing out a request using setReadTimeout() on a client. Set this to an integer giving the number of milliseconds before timing out: Remember this must be given in milliseconds.


Scala SDK - Developer

This example sets the timeout to 2 minutes (120 seconds * 1000 milliseconds). Since version 0.9.0, the Java SDK supports connecting to multiple tenants.


Scala SDK - Developer

From version 4.0.0 onwards you can create any number of clients against any number of different tenants, since every operation that interacts with a tenant now explicitly requires a client to be provided to it: Constructing a new client with a different tenant's URL is sufficient to create connectivity to that other tenant. You can also (optionally) provide a second argument to directly give the API token for the tenant.


Scala SDK - Developer

Create an object as usual. You can access the operations for assets directly on the client, under client.assets.


Scala SDK - Developer

These will generally give you the most flexibility — they can handle multiple objects at a time and allow overrides. Every operation on the client itself has a variant with an (optional) final argument through which you can override settings like retry limits or timeouts for this single request.


Scala SDK - Developer

You can use the from(client) factory method to initialize the request options with all the settings of your client, and then you only need to chain on those you want to override for this particular request. Alternatively, you can pass the client to the operation on the object itself.


Scala SDK - Developer

Limit the number of clients to those you must have Each client you create maintains its own independent copy of various caches. So the more clients you have, the more resources your code will consume.


Scala SDK - Developer

For this reason, we recommended limiting the number of clients you create to the bare minimum you require — ideally just a single client per tenant. Using a proxy To use the Java SDK with a proxy, you need to send in some additional parameters when running any java.


Scala SDK - Developer

command. These are described in detail in the Java documentation , but are summarized here for simplicity: socksProxyHost should be set to the hostname for your SOCKS proxy socksProxyPort should be set to the port for your SOCKS proxy (default being 1080) Providing credentials to the proxy In either case, if you need to authenticate to your proxy, you will need to wrap whatever code you want to run to set up these credentials using something like the following: You need to create a built-in Java PasswordAuthentication object.


Scala SDK - Developer

Provide your username as the first argument. .


Scala SDK - Developer

and your password as the second argument, as a char[]. (Of course, you should not hard-code your password in your code itself, but rather pull it from elsewhere.) Then use setProxyCredential() to pass this PasswordAuthentication object to the Atlan client, before any of the rest of the code will execute.


Clojure SDK - Developer

Obtain the SDK For Clojure, you can reuse the existing Java SDK as-is. It is available on Maven Central, ready to be included in your project: Include the latest version of the Java SDK in your project as a dependency (replace the version number with the latest version indicated in the badges above).


Clojure SDK - Developer

The Java SDK uses slf4j for logging purposes. You can include the org.clojure/tools.logging utility as a simple binding mechanism to send any logging information out to your console (standard out).


Clojure SDK - Developer

Configure the SDK There are two ways to configure the SDK: Using environment variables ATLAN_API_KEY should be given your Atlan API token , for authentication ( don't forget to assign one or more personas to the API token to give access to existing assets! ) ATLAN_BASE_URL should be given your Atlan URL (for example, https://tenant.atlan.com ) Here's an example of setting those environment variables: On client creation If you prefer to not use environment variables, you can do the following: Delve into more detailed examples: Common tasks Common operations on assets, that are available across all assets.


Clojure SDK - Developer

Discover actions Common operations on assets, that are available across all assets. Asset-specific Operations that are specific to certain assets.


Clojure SDK - Developer

Focus on a specific kind of asset Operations that are specific to certain assets. Focus on a specific kind of asset Governance structures Operations dealing with governance structures, rather than assets.


Clojure SDK - Developer

Manage governance structures Operations dealing with governance structures, rather than assets. Manage governance structures Samples Real code samples our customers use to solve particular use cases.


Clojure SDK - Developer

Review live samples Real code samples our customers use to solve particular use cases. Review live samples Events Delve deep into the details of the events Atlan triggers.


Clojure SDK - Developer

Learn more about events Delve deep into the details of the events Atlan triggers. Learn more about events The SDK defines checked exceptions for the following categories of error: A given API call could fail due to all of the errors above.


Clojure SDK - Developer

So these all extend a generic AtlanException checked exception, and all API operations throw AtlanException. For example, when creating a connection there is an asynchronous process that grants permissions to the admins of that connection.


Clojure SDK - Developer

So there can be a slight delay between creating the connection and being permitted to do any operations with the connection. During that delay, any attempt to interact with the connection will result in a PermissionException , even if your API token was used to create connection in the first place.


Clojure SDK - Developer

Another example you may occasionally hit is some network issue that causes your connection to Atlan to be interrupted. In these cases, an ApiConnectionException will be raised.


Clojure SDK - Developer

Don't worry, the SDK retries automatically While these are useful to know for detecting issues, the SDK automatically retries on such problems. Atlan is a distributed, cloud-native application, where network problems can arise.


Clojure SDK - Developer

These advanced configuration options allow you to optimize how the SDK handles such ephemeral problems. The SDK uses slf4j to be logging framework-agnostic.


Clojure SDK - Developer

You can therefore configure your own preferred logging framework: Add log4j2 bindings. The SDK handles automatically retrying your requests when it detects certain problems: When an ApiConnectionException occurs that is caused by an underlying ConnectException or SocketTimeoutException.


Clojure SDK - Developer

When there is a 403 response indicating that permission for an operation is not (yet) available. When there is a 500 response indicating that something went wrong on the server side.


Clojure SDK - Developer

If any request encounters one of these problems, it will be retried. Before each retry, the SDK will apply a delay using: An exponential backoff (starting from 500ms) A jitter (in the range of 75-100% of the backoff delay) Each retry will be at least 500ms, and at most 5s.


Clojure SDK - Developer

(Currently these values are not configurable.) For each request that encounters any of these problems, only up to a maximum number of retries will be attempted. (This is set to 3 by default.) You can configure the maximum number of retries globally using setMaxNetworkRetries() on a client.


Clojure SDK - Developer

Set this to an integer: The SDK will only wait so long for a response before assuming a network problem has occurred and the request should be timed out. By default, this is set to 80 seconds.


Clojure SDK - Developer

You can configure the maximum time the SDK will wait before timing out a request using setReadTimeout() on a client. Set this to an integer giving the number of milliseconds before timing out: Remember this must be given in milliseconds.


Clojure SDK - Developer

This example sets the timeout to 2 minutes (120 seconds * 1000 milliseconds). Since version 0.9.0, the Java SDK supports connecting to multiple tenants.


Clojure SDK - Developer

From version 4.0.0 onwards you can create any number of clients against any number of different tenants, since every operation that interacts with a tenant now explicitly requires a client to be provided to it: Constructing a new client with a different tenant's URL is sufficient to create connectivity to that other tenant. You can also (optionally) provide a second argument to directly give the API token for the tenant.


Clojure SDK - Developer

Create an object as usual. You can access the operations for assets directly on the client, under client.assets.


Clojure SDK - Developer

These will generally give you the most flexibility — they can handle multiple objects at a time and allow overrides. Every operation on the client itself has a variant with an (optional) final argument through which you can override settings like retry limits or timeouts for this single request.


Clojure SDK - Developer

You can use the from(client) factory method to initialize the request options with all the settings of your client, and then you only need to chain on those you want to override for this particular request. Alternatively, you can pass the client to the operation on the object itself.


Clojure SDK - Developer

Limit the number of clients to those you must have Each client you create maintains its own independent copy of various caches. So the more clients you have, the more resources your code will consume.


Clojure SDK - Developer

For this reason, we recommended limiting the number of clients you create to the bare minimum you require — ideally just a single client per tenant. Using a proxy To use the Java SDK with a proxy, you need to send in some additional parameters when running any java.


Clojure SDK - Developer

command. These are described in detail in the Java documentation , but are summarized here for simplicity: socksProxyHost should be set to the hostname for your SOCKS proxy socksProxyPort should be set to the port for your SOCKS proxy (default being 1080) Providing credentials to the proxy In either case, if you need to authenticate to your proxy, you will need to wrap whatever code you want to run to set up these credentials using something like the following: You need to create a built-in Java PasswordAuthentication object.


Clojure SDK - Developer

Provide your username as the first argument. .


Clojure SDK - Developer

and your password as the second argument, as a char[]. (Of course, you should not hard-code your password in your code itself, but rather pull it from elsewhere.) You need to create a built-in Java PasswordAuthentication object.


Clojure SDK - Developer


Clojure SDK - Developer

and your password as the second argument, as a char[]. (Of course, you should not hard-code your password in your code itself, but rather pull it from elsewhere.) Then use setProxyCredential() to pass this PasswordAuthentication object to the Atlan client, before any of the rest of the code will execute.


Clojure SDK - Developer

Then use setProxyCredential() to pass this PasswordAuthentication object to the Atlan client, before any of the rest of the code will execute.


Go SDK - Developer

Obtain the SDK The Go SDK is currently in a pre-release, experimental state. While in this state, we reserve the right to make any changes to it (including breaking changes) without worrying about backwards compatibility, semantic versioning, and so on.


Go SDK - Developer

If you are eager to experiment with it, it is available on GitHub. You can use Go dependencies to install it directly from there.


Go SDK - Developer

We welcome your feedback during the pre-release, but cannot commit to any specific revisions or timelines at this point in time. Configure the SDK There are two ways to configure the SDK: Using environment variables ATLAN_API_KEY should be given your Atlan API token , for authentication ( don't forget to assign one or more personas to the API token to give access to existing assets!


Go SDK - Developer

) ATLAN_BASE_URL should be given your Atlan URL (for example, https://tenant.atlan.com ) Here's an example of setting those environment variables: On client creation If you prefer to not use environment variables, you can do the following: Careful not to expose your API token! We generally discourage including your API token directly in your code, in case you accidentally commit it into a (public) version control system.


Go SDK - Developer

But it's your choice exactly how you manage the API token and including it for use within the client. That's it — once these are set you can start using your SDK to make live calls against your Atlan instance!


Go SDK - Developer

🎉 Delve into more detailed examples: Common tasks Common operations on assets, that are available across all assets. Discover actions Common operations on assets, that are available across all assets.


Go SDK - Developer

Asset-specific Operations that are specific to certain assets. Focus on a specific kind of asset Operations that are specific to certain assets.


Go SDK - Developer

Focus on a specific kind of asset Governance structures Operations dealing with governance structures, rather than assets. Manage governance structures Operations dealing with governance structures, rather than assets.


Go SDK - Developer

Manage governance structures Samples Real code samples our customers use to solve particular use cases. Review live samples Real code samples our customers use to solve particular use cases.


Go SDK - Developer

Review live samples Events Delve deep into the details of the events Atlan triggers. Learn more about events Delve deep into the details of the events Atlan triggers.


Go SDK - Developer

Learn more about events The SDK defines exceptions for the following categories of error: A given API call could fail due to all of the errors above. So these all extend a generic AtlanError exception, and all API operations can potentially raise AtlanError.


Go SDK - Developer

For example, when creating a connection there is an asynchronous process that grants permissions to the admins of that connection. So there can be a slight delay between creating the connection and being permitted to do any operations with the connection.


Go SDK - Developer

During that delay, any attempt to interact with the connection will result in a PermissionError , even if your API token was used to create connection in the first place. Another example you may occasionally hit is some network issue that causes your connection to Atlan to be interrupted.


Go SDK - Developer

In these cases, an ApiConnectionError will be raised. Atlan is a distributed, cloud-native application, where network problems can arise.


Go SDK - Developer

The SDK therefore automatically attempts to handle ephemeral problems. The SDK uses the slog library internally to provide a flexible framework for emitting log messages.


Go SDK - Developer

You can enable logging for your SDK script by adding the following lines above your snippets: You can enable logging by using .SetLogger() on the context object with various logging levels: "debug" : used to give detailed information, typically of interest only when diagnosing problems (mostly used level in SDK). "info" : used to confirm that things are working as expected.


Go SDK - Developer

"warn" : used as an indication that something unexpected happened, or as a warning of some problem in the near future. "error" : indicates that due to a more serious problem, the SDK has not been able to perform some operation.


Go SDK - Developer

You can enable logging by using .SetLogger() on the context object with various logging levels: "debug" : used to give detailed information, typically of interest only when diagnosing problems (mostly used level in SDK). "info" : used to confirm that things are working as expected.


Go SDK - Developer


Events - Developer

Atlan produces events when certain activities occur in the system. You can tap into these in a push-based integration model to take action the moment they occur.


Events - Developer

To tap into the events, you need to first set up a webhook in Atlan. Have a look at the event handling pattern for more details on implementing event-handling from webhooks using either of the SDKs.


Raw REST API - Developer

Raw REST API Walk through step-by-step in our intro to custom integration course (30 mins). There are a number of details and nuances to understand about the underlying REST APIs to use them most effectively: the underlying REST API communications (HTTP protocols, methods, headers, endpoint URLs, response codes, etc) translating the complex JSON structures for each request and response payload knowing exactly which values are required (and which aren't) depending on the object you're interacting with, what operation you're carrying out, etc (including which exact string (and capitalization) to use for values that are really enumerations behind-the-scenes) Ultimately, all pull-based integration mechanisms (including the SDKs) use the REST API; however, the SDKs also encode best practices to avoid the need to understand all these details and low-level nuances.


Raw REST API - Developer

If you want to adopt these best practices from the start, we would strongly recommend directly using any of our SDKs rather than the raw REST APIs directly: That being said, we have documented the raw REST API interactions in most cases. So if you really want to interact with the APIs directly, there should still be some guidance — anywhere you see Raw REST API gives details on endpoint URLs, methods, and payloads.


Raw REST API - Developer

If all you really want to do is some initial experimentation directly against the API, you can use Postman. We do not maintain a Postman collection of requests, but you can use the Raw REST API tab to find the endpoint and an example payload to use for most operations here on developer.atlan.com.


Raw REST API - Developer

Why not just publish an OpenAPI spec? We did try this in the past, as we liked the idea of generating client libraries using tools like the OpenAPI Generator.


Raw REST API - Developer

Unfortunately, in our own testing of these tools, we found that: We could generate code that is free from syntax errors, but the generated code was not fully functional. Problems we found: The generated code drops significant portions of data from payloads.


Raw REST API - Developer

(Our APIs are payload-rich and endpoint-light, while the generators seem to favor endpoint-rich and payload-light APIs.) The various objects the generator creates often make developer consumption cumbersome — long, difficult-to-read object names; many variations of similar objects; and so on. The generated code naturally does not include any validation that can't be encoded in the OpenAPI spec.


Raw REST API - Developer

To add this we'd need to wrap the generated code with another layer anyway. After several attempts at mangling the OpenAPI spec to meet the constraints of the code generator, we eventually decided to go the way we've seen other API-first companies adopt.


Raw REST API - Developer

We found very few API-first companies appear to rely on these code generators, but rather directly maintain their own SDKs for which they may have their own code generators. (Which is in fact exactly what we're doing as well.) Request for feedback If you use the raw REST APIs rather than one of the provided SDKs, we would love to understand more.


Raw REST API - Developer

If you can spare a few minutes to fill out our survey , we would be very grateful!


Customer support | Atlan Documentation

One of Atlan's core values is to help you and your team do your life's best work. ð That's why Atlan wants to make it as easy as possible for you to keep driving your work forward with data.


Customer support | Atlan Documentation

Atlan's customer support is a combination of several teams in Atlan: Product support personnel Cloud support personnel DevOps/engineering support personnel Vast repository of self-service resources Service-level commitment Atlan's Technical Support team provides support globally with high response commitment levels. This includes 24/7 SRE support for critical (P0) issues.


Customer support | Atlan Documentation

Customers get a service-level commitment, including the following: 99.5% uptime for Atlan Dedicated support center, available from within the Atlan product Commitments for aggressive response times for business critical issues Designated Customer Success Manager to assist with escalations Ways to contact support ï¸ Email support at a dedicated customer support email account ( [email protected] ) ð ¨ ð » In-product support widget to log tickets and a help desk portal to log and track tickets. You can sign up to track support tickets on the help desk portal.


Customer support | Atlan Documentation

You must use your organizational email address as the username and create a password. ð Submit a support request via the online form.


Customer support | Atlan Documentation

To track your support tickets: Navigate to https://atlan.zendesk.com and log into the help desk portal with your credentials or via SSO. From the top right, click your avatar, and then from the dropdown, click My activities.


Customer support | Atlan Documentation

On the My activities page, you can do the following: My requests and Requests I'm CC'd on - view and edit the support tickets you either created or were copied on, respectively. Organization requests - to access all other support tickets for your organization, please reach out to your customer success manager.


Customer support | Atlan Documentation

Atlan provides you with read access to all the support tickets for your organization. To be able to comment on or close them, you must be CC'd on all tickets.


Customer support | Atlan Documentation

My requests and Requests I'm CC'd on - view and edit the support tickets you either created or were copied on, respectively. Organization requests - to access all other support tickets for your organization, please reach out to your customer success manager.


Customer support | Atlan Documentation


Customer support | Atlan Documentation

Hours of operation 24x7 availability for all requests and issues Severity levels The Atlan Technical Support team determines the severity of an issue. The customer's position is considered, and these guidelines are followed to determine priority.


Customer support | Atlan Documentation

Below are the response time SLAs: Escalation procedure If the business impact of a support request changes or a ticket isn't being handled according to your expectations, you may escalate the ticket. Please first speak with the Technical Support representative assigned to the ticket to confirm that the business impact and urgency are understood.


Customer support | Atlan Documentation

You may further escalate by contacting: 1st level of escalation : Technical Support Engineer 2nd level of escalation : Director, Support 3rd level of escalation : Head of Customer Experience Ways to contact support Hours of operation


Email Protection | Cloudflare

You are unable to access this email address atlan.com The website from which you got to this page is protected by Cloudflare. Email addresses on that page have been hidden in order to keep them from being accessed by malicious bots.


Email Protection | Cloudflare

You must enable Javascript in your browser in order to decode the e-mail address. If you have a website and are interested in protecting it in a similar way, you can sign up for Cloudflare.


Email Protection | Cloudflare

How does Cloudflare protect email addresses on website from spammers? Can I sign up for Cloudflare?


Email Protection | Cloudflare

Cloudflare Ray ID: 97e29b39d988990a • Your IP: Click to reveal 130.91.58.216 • Performance & security by Cloudflare


Developing with Atlan - Developer

Overall site map If you are new to Atlan, or to developing with Atlan, start with one of the following two options. These will set you up to develop with Atlan, step-by-step.