File Structure
Connectors are organized into a main connector file and (optionally) partial files for each resource:- Use kebab-case for file names
- Reference partials in the main file using
$ref: provider.resource - Add references in alphabetical order (not required, but recommended for readability)
Main Connector File
The main connector file defines metadata, authentication, and references to action partials.Info Section
| Field | Required | Description |
|---|---|---|
title | Yes | Display name shown in the StackOne Hub and dashboard |
key | Yes | Unique lowercase identifier used in action names (e.g., bamboohr_list_employees) |
version | Yes | Semantic version for tracking connector changes |
assets.icon | No | URL to provider logo (displayed in Hub and dashboard) |
description | No | Brief description for documentation and AI context |
When to use each field
When to use each field
title: User-facing name. Use the official provider name (e.g., “BambooHR” not “Bamboo HR”)key: Machine-readable identifier. Must be lowercase with underscores. Cannot be changed after deployment without breaking existing integrationsversion: Increment when making changes. Use semantic versioning: major.minor.patchassets.icon: Usehttps://stackone-logos.com/api/{key}/filled/pngfor consistent stylingdescription: Keep concise. Used by AI agents for context when discovering connectors
Base URL
ThebaseUrl defines the root URL for all API requests. It supports credential interpolation for providers with dynamic domains.
When to use dynamic baseUrl
When to use dynamic baseUrl
Use credential interpolation when the provider requires:
- Customer-specific subdomains: Many B2B SaaS products use
{company}.provider.comURLs - Region selection: Some providers have separate endpoints per region (US, EU, APAC)
- Environment switching: Sandbox vs production endpoints
configFields in your authentication config. These are fields your customer fills in when connecting their account.Authentication
Authentication is defined once in the main connector file. All actions inherit it.Setup vs Config Fields
| Field Type | Who Fills It | When | Example |
|---|---|---|---|
setupFields | You (the developer) | Dashboard integration config | Client ID, Client Secret, Scopes |
configFields | Your customer | Hub account connection | API Token, Subdomain |
Choosing between setupFields and configFields
Choosing between setupFields and configFields
Use
setupFields for:- OAuth client credentials (Client ID, Client Secret)
- Scopes that you control
- API keys that belong to your app, not the end user
- Values you configure once in the StackOne dashboard
configFields for:- Customer’s own API tokens or keys
- Customer-specific identifiers (subdomain, account ID, workspace ID)
- Any value that differs per customer connection
- Values the customer enters in the Hub when linking their account
secret: true: Masks the field value and encrypts storage (use for tokens, keys, passwords)required: true: Field must be filled before connection can completeplaceholder: Shows example format without exposing real valuestooltip: Additional help text shown on hover
Example: API Key Authentication
Other Authentication Types
The Falcon engine supports several authorization types:| Type | authorization.type | Use Case |
|---|---|---|
| Bearer token | bearer | API key or OAuth access token in Authorization: Bearer header |
| Basic auth | basic | Username/password encoded as Authorization: Basic header |
| Custom headers | none + customHeaders | Provider-specific header-based auth |
| OAuth 2.0 | oauth2 | Full OAuth flow with authorization URL, token exchange, and refresh |
Actions
Actions define the operations your connector can perform. Each action consists of metadata, inputs, steps, and result configuration.Action Structure
| Field | Required | Description |
|---|---|---|
actionId | Yes | Unique identifier within the connector. Forms the action name: {connector_key}_{actionId} |
categories | Yes | Array of verticals this action belongs to (e.g., hris, ats, crm). See YAML Reference |
actionType | Yes | Identifies the type of the action (list, get, create, update, delete, custom) |
schema | Conditional | Required for unified actions. Specifies which StackOne schema to map to |
label | Yes | Human-readable name shown in Actions Explorer and AI tool descriptions |
description | Yes | Explains what the action does. Used by AI agents for tool selection |
context | No | URL to provider API docs. Helps AI agents understand the action |
entrypointUrl | No | Alternative to defining URL in steps. The main endpoint path |
entrypointHttpMethod | No | Alternative to defining method in steps. HTTP method to use |
How these fields affect your action
How these fields affect your action
actionId: Keep it descriptive and follow the pattern{verb}_{resource}(e.g.,list_users,get_employee,create_candidate). Cannot be changed after deployment.categories: Determines where the action appears in the Actions Explorer. An action can belong to multiple categories.actionType: Choosingcustomis fastest since no schema mapping is needed. Use unified types (list,get, etc.) when you want cross-provider compatibility.schema: Must match a StackOne schema name (e.g.,users,employees,candidates). Only required whenactionTypeis unified.label+description: These appear in the Actions Explorer and are sent to AI agents. Write them for humans, not machines.context: Adding the provider’s API doc URL helps the Builder Agent and AI tools understand edge cases.
Action Types
| Type | Description |
|---|---|
list | Retrieve multiple records, typically with pagination |
get | Retrieve a single record by identifier |
create | Create a new resource |
update | Modify an existing resource |
delete | Remove a resource |
custom | Provider-specific operation that doesn’t fit standard CRUD patterns |
refresh_token | Internal OAuth token refresh (use with internal category) |
schema field to map provider data to StackOne’s standardized schemas (e.g., schema: employees). Without schema, the action returns provider data as-is. See Field Configs for mapping details.
Inputs
Inputs define the parameters your action accepts. Each input specifies aname, type, location (in), and whether it’s required:
string, number, boolean, datetime_string, object
Input locations: path, query, body, headers
For full input property documentation including nested objects, see the YAML Reference — Inputs.
Step Functions
Step functions are the building blocks of actions. Each step performs one operation.Choosing the right step function
Choosing the right step function
| Scenario | Use |
|---|---|
| Single API call (get user, create record) | request |
| List endpoint with cursor pagination | paginated_request |
| List endpoint with offset/page pagination | request + manual cursor handling |
| Per-item API calls (detail fetch for each ID) | request with iterator step |
| Transform provider data to output schema | map_fields |
| Convert field types after mapping | typecast |
| Merge results from multiple API calls | group_data |
| Return hardcoded enum values | static_values |
| Combine static + dynamic data | merge_collections |
| Upload a file | upload_file |
| Download a file | download_file |
| SOAP/XML API call | soap_request |
- GET single resource:
request→result - LIST with pagination:
paginated_request→result - Unified action:
request→map_fields→typecast→result - Multi-source data:
request(x2) →group_data→result - Per-item enrichment:
request→ iteratorrequest→group_data→result - Static + dynamic merge:
static_values+request→merge_collections→result
request - HTTP Requests
Make a single HTTP request to the provider API. Use args to pass headers, query parameters, and body fields. Use response.dataKey to extract nested data from the response.
paginated_request - Cursor Pagination
Automatically fetches all pages using cursor-based pagination. StackOne handles cursor tracking, page assembly, and continuation logic.
response.dataKey, checks response.nextKey for a continuation cursor, and repeats until no cursor is returned. All pages are combined automatically.
map_fields - Transform Data
Transform provider response data into your output schema. Takes a dataSource (typically a previous step’s output), evaluates an expression per field against each record, and converts to the specified type.
typecast - Type Conversion
Apply type conversions to data. Used for unified actions.
group_data - Combine Results
Merge data from multiple steps into a single dataset.
static_values - Return Static Data
Return predefined values without making an API request. Useful for enum lookups or constant data.
merge_collections - Merge Arrays
Merge multiple data collections into a single array.
upload_file / download_file - File Operations
Handle file uploads (multipart form) and downloads (with encoding options).
soap_request - SOAP API
Make SOAP (XML) requests. Used for enterprise providers like Workday.
Iterator Steps (Foreach)
Iterator steps execute one or more step functions for each item in a collection. Use them when you need to make per-item API calls — for example, fetching detailed data for each record returned by a list endpoint.Structure
An iterator step is defined by adding theiterator property to a step. The iterator value is a JSONPath expression that resolves to an array.
How It Works
- The
iteratorexpression is evaluated to produce an array - For each item in the array, the step function(s) execute
- Inside the step, you can access:
$.iterator.item— the current array element$.iterator.index— the current iteration index (0-based)$.iterator.current— the output of the previous step function in the same iteration (when usingstepFunctions)
- All iteration outputs are collected into an array at
$.steps.{stepId}.output.data
Single Step Function
The most common pattern — make one API call per item:Multiple Step Functions
UsestepFunctions (plural) to execute a sequence of functions per iteration. Each function can access the output of the previous one via $.iterator.current:
Conditional Iterator
Like regular steps, iterator steps support thecondition and ignoreError properties:
Iterator Context Reference
| Expression | Description |
|---|---|
$.iterator.item | Current item from the iterated array |
$.iterator.index | Current iteration index (0-based) |
$.iterator.current | Output from the previous step function in stepFunctions |
${iterator.item} | String interpolation of current item (for URLs) |
${iterator.item.fieldName} | Nested field from current item |
Expression Syntax
The Falcon engine supports three expression formats for dynamic values. For the complete expression language reference including all built-in functions, operators, and detailed examples, see the Expression Language page.JSONPath (Preferred)
Direct data access. Use for any direct reference.String Interpolation (${...})
Use for embedding values within strings.
JEXL Expressions ('{{...}}')
Use for conditional logic and transformations. Must be in single quotes.
present(), missing(), includes(), join(), capitalize(), truncate(), regexMatch(), now() — see full reference.
Conditional Arguments
Include arguments only when conditions are met:Result
Define the action’s response output. Read operations:Field Configs (Unified Actions)
For unified actions (those with aschema field), fieldConfigs map provider response fields to StackOne’s standardized schema: