Getting started
In this section we will guide you through the basic process of creating your first draft of the SOAR App.
Actions philosophy
Apps (aka Connectors) in Splunk SOAR are extensions that enrich the platform functionality. Each app provides a new set of actions that can be used for the security investigation (also automated one, when used in playbooks). Usually, a single app adds actions for one specific tool or 3rd party service (e.g. whois lookup or geolocation).
When building your app, you will focus on implementing the actions like sending data to the external service or updating the containers on SOAR platform.
This SDK is a set of tools to build, test and run your own app that will extend the SOAR installation by implementing actions.
Your first app
The following guide will get you through the process of building your first app, explaining its crucial components and functionality.
Setting up your machine
You will need a Mac or Linux machine. Windows is not supported.
First, install some necessary tools:
Git
uv: the Python version and environment manager used by the SDK
Next, install Python 3.9 and 3.13. These are the two versions currently supported for SOAR apps:
uv python install 3.9
uv python install 3.13
Finally, install the SOAR SDK as a command-line tool:
uv tool install splunk-soar-sdk
It may also be helpful to install ruff
and pre-commit
, as these are used often when building SOAR apps:
uv tool install ruff
uv tool install pre-commit
Creating a new app
To create a new, empty app, simply run:
soarapps init
This will create the basic directory structure for your app, which you can open in your editor. See The app structure below for more information.
Migrating an existing app
To migrate an existing app, myapp
, that was written in the old BaseConnector
framework, run:
soarapps convert myapp
The conversion script will create a new SDK app, migrating the following aspects of your existing app:
Asset configuration parameters
Action names, descriptions, and other metadata
Action parameters and outputs
You will need to re-implement the code for each of your actions yourself.
Automatic migration is not yet supported for the following features, and you will need to migrate these yourself:
Custom views
Webhook handlers
Custom REST handlers (must be converted to webhooks, as the SDK does not support Custom REST)
The app structure
Running the soarapps init
or soarapps convert
commands will create the following directory structure:
my_app/
├─ src/
│ ├─ __init__.py
│ ├─ app.py
├─ .pre-commit-config.yaml
├─ logo.svg
├─ logo_dark.svg
├─ pyproject.toml
We describe and explain each of the files in full in the dedicated documentation pages about the app structure.
For now, let’s shortly go over each of the components in the structure, so we can create our first action.
The src
directory and the app.py
file
In this directory you will develop your app source code. We typically place here the app.py
file
with the main module code. Keep in mind you can always add more python modules to this directory and import
them in the app.py
file to create cleaner maintainable code.
In the app.py
file we typically create the App
instance and define actions and provide its implementation.
This module will be used in our pyproject.toml
app configuration to point the app
object as main_module
for
use in SOAR platform when running actions.
Read the detailed documentation on the app.py file contents
Note that the test_connectivity
action is mandatory for each app. It is used when installing the app in
the SOAR platform and checked usually when a new asset is added for the app. This is why it is always provided
in the app scratch files.
The logo*.svg
files
These files are used by SOAR platform to present your application in the web UI. You should generally provide
two versions of the logo. The regular one is used for light mode and the _dark
file is used for the dark mode.
PNG files are also acceptable, but SVGs are preferred because they scale more easily.
pyproject.toml
configuration file
This file defines the app development parameters, dependencies, and also configuration data for the app.
In this file you will define poetry dependencies (including this SDK) and basic information like the name of the app, its version, description, authors, and other params.
Read the detailed documentation on the pyproject.toml file contents
Configuring the environment
Once you have your starting app file structure, you will need to set up your app development environment.
First, set up a Git repository:
git init
In your app directory, install the pre-commit hooks:
pre-commit install
Then you need to set up the environment using uv. It will set up the virtual environment and install necessary dependencies. You should also add the SDK to your project:
uv add splunk-soar-sdk
uv sync
It’s also useful to activate the virtual environment created by uv, so that all your shell commands run in context of your app:
source .venv/bin/activate
Creating your first action
Your app should already have the app
object instance created in the app.py
file. In the future you will
initialize it with extra arguments, like the asset configuration, to specify the asset data. You can read more on
how to initialize the app in the App Configuration documentation.
For now let’s focus on creating a very simple action and see the basics of its structure. You should already have
one action defined in your app.py
file called test_connectivity
which must be created in every app. You can check
how it is constructed. Our first action will be very similar to it.
The app
instance provides the action
decorator which is used to turn your python functions into SOAR App actions.
Here’s the code of the simplest action you can create:
@app.action()
def my_action(params: Params, asset: BaseAsset) -> ActionOutput:
"""This is the first custom action in the app. It doesn't really do anything yet."""
return ActionOutput()
Let’s break down this example to explain what happens here.
App.action
decorator
@app.action()
The decorator is connecting your function with the app instance and the SOAR engine.
It’s responsible for many things related to running the app under the hood, so you can focus on developing the action. Here are some things it takes care of:
registers your action, so it is invoked when running the app in SOAR platform
sets the configuration values for the action (which you can define by providing extra params in the call parenthesis)
checks if the action params are provided, valid and of the proper type
inspects your action arguments types and validates them
For more information about the App.action
decorator, see the API Reference.
The action declaration
def my_action(params: Params, asset: BaseAsset) -> ActionOutput:
my_action
is the identifier of the action and as such it will be visible later in the SOAR platform.
App.action
decorator automatically converts this to “my action” string name that will be used when generating
the app Manifest file and the documentation.
Each action should accept and define params
and asset
arguments with proper typehints.
The params
argument should always be of the class type inherited from soar_sdk.params.Params
.
You can read more on defining action params in the API Reference.
If your action takes no parameters, it’s fine to use the Params
base class here.
The asset
argument contains your asset configuration, which is discussed further in the App Configuration documentation. It should be of a type that inherits from soar_sdk.asset.BaseAsset
, and should be the same type that is specified as the asset_cls
of your app.
Your action must have a return type that extends from soar_sdk.action_results.ActionOutput
. This is discussed further in the Action Outputs documentation. The return type must be hinted.
The action description docstring
"""This is the first custom action in the app. It doesn't really do anything yet."""
You should always provide the docstring for your action. It makes your code easier to understand and maintain, but
also, the docstring is (by defualt) used by the App.action
decorator to generate the action description for the
app documentation in SOAR platform.
The description should be kept short and simple, explaining what the action does.
The action result
return ActionOutput()
Each action must return at least one action result. While you can create multiple instances of the action result and pass more than one values, the one that is most important is the general action result.
Prior to SDK, the connectors had to define and create their own ActionResult
instances. This is simplified now
in SDK. If your action succeeds, it should return an instance of your output class. If it fails, it should raise an exception.
Our example action simply returns the ActionOutput
base class, as it does not yet generate any results.
Read more on action results and outputs in the Action Outputs section of the API Reference.
As you can see, this simple action is taking bare Params
object, so with no defined params and simply returns
the result of successful run.
Testing and building the app
Running from the command line
You can run any of your app’s actions directly in your CLI, without installing a full copy of SOAR. Simply invoke the Python file that contains your app:
python src/app.py action my-action -p test_params.json -a test_asset.json
You should provide a parameters file (-p
) which contains the JSON-encoded parameters for your action.
The asset file (-a
) contains the asset config in JSON format.
This command will run your action on your local machine, and print its output to the command line.
Building an app package
Run soarapps package build
to generate an app package.
By default, this creates <appname>.tgz
in the root directory of your app.
This package contains all the code and metadata for your app.
It also contains all the dependency wheels for your app, which are sourced from the PyPI CDN based on uv.lock
.
Because of this, you should ensure that your uv.lock
is always up to date.
Installing and running the app
Now you can install the app in your SOAR platform to test how it works. You can do this by using the web interface of the platform.
You can also do this from the command line:
soarapps package install myapp.tgz soar.example.com
Getting help
If you need help, please file a GitHub issue at https://github.com/phantomcyber/splunk-soar-sdk/issues.
Next steps
Now that you have a working app, you can start its development. Here’s what you can check next when working with the app you create: