Getting Started
This guide walks you through setting up Ductape in your project and making your first API call.
Code examples below use tabs for TypeScript, Java, Go, and .NET where the raw @ductape/sdk applies. NestJS examples (NestJS docs) are TypeScript only.
CLI
For local development, login, linking a project, and managing resources from the terminal, see the Ductape CLI (ductape login, ductape resources storage list, ductape start).
Installation
Install the Ductape SDK for your language:
- TypeScript
- Java
- Go
- .NET
npm install @ductape/sdk@0.1.8
<dependency>
<groupId>app.ductape</groupId>
<artifactId>sdk</artifactId>
<version>0.1.8</version>
</dependency>
go get github.com/ductape/ductape/sdk/go@v0.1.8
dotnet add package Ductape.Sdk --version 0.1.8
Initialize the SDK
Create a Ductape instance with your workspace credentials. Set product and env on the constructor so you do not repeat them on every call (see SDK runtime defaults):
- TypeScript
- Java
- Go
- .NET
import Ductape from '@ductape/sdk';
const ductape = new Ductape({
accessKey: process.env.DUCTAPE_ACCESS_KEY!,
product: 'my-product',
env: 'dev',
});
import app.ductape.sdk.Ductape;
import app.ductape.sdk.core.EnvType;
import app.ductape.sdk.core.RequestContext;
Map<String, Object> ductape = new Ductape(Map.of(
accessKey: System.getenv("DUCTAPE_ACCESS_KEY")!,
"product", "my-product",
"env", "dev",
));
import (
"context"
"github.com/ductape/ductape/sdk/go/core"
"github.com/ductape/ductape/sdk/go/ductape"
)
auth := core.NewRequestContext("", "", "", "", os.Getenv("DUCTAPE_ACCESS_KEY")!)
client, err := client.New(core.EnvProduction, auth)
if err != nil {
return err
}
using Ductape.Sdk;
using Ductape.Sdk.Core;
var ductape = new Ductape({
accessKey: Environment.GetEnvironmentVariable("DUCTAPE_ACCESS_KEY")!,
["product"] = "my-product",
["env"] = "dev",
});
You can find your access key in the Ductape dashboard under Settings > API Keys.
Your First Action
Once you've added an app and connected it to a product, you can run actions:
- TypeScript
- Java
- Go
- .NET
const result = await ductape.api.run({
app: 'stripe',
action: 'create-charge',
input: {
amount: 1000,
currency: 'usd',
}
});
console.log(result);
Map<String, Object> result = ductape.api().run(Map<String, Object>.of(
"app", "stripe",
"action", "create-charge",
input: Map.of(
"amount", 1000,
"currency", "usd",
)
));
System.out.println(result);
import "context"
result := client.Api.Run(ctx, map[string]any{
"app": "stripe",
"action": "create-charge",
input: {
"amount": 1000,
"currency": "usd",
}
});
fmt.Println(result);
var result = await await ductape.Api.RunAsync(new Dictionary<string, object?>
{
["app"] = "stripe",
["action"] = "create-charge",
input: {
["amount"] = 1000,
["currency"] = "usd",
}
});
Console.WriteLine(result);
Project Setup
For real applications, initialize Ductape once and share the instance across your project. This ensures credentials, OAuth tokens, and database connections are available everywhere.
Create a Ductape Module
- TypeScript
- Java
- Go
- .NET
import Ductape from '@ductape/sdk';
const env = process.env.NODE_ENV === 'production' ? 'prd' : 'dev';
// Create a single instance — product/env defaults live on the constructor only
export const ductape = new Ductape({
accessKey: process.env.DUCTAPE_ACCESS_KEY!,
product: 'my-product',
env,
});
// Configure action credentials once at startup
ductape.api.config({
app: 'stripe',
credentials: {
'headers:Authorization': '$Secret{STRIPE_API_KEY}',
}
});
ductape.api.config({
app: 'twilio',
credentials: {
'headers:Authorization': '$Secret{TWILIO_AUTH_TOKEN}',
}
});
import app.ductape.sdk.Ductape;
import app.ductape.sdk.core.EnvType;
import app.ductape.sdk.core.RequestContext;
Map<String, Object> env = System.getenv("NODE_ENV") === 'production' ? 'prd' : 'dev';
// Create a single instance — product/env defaults live on the constructor only
export Map<String, Object> ductape = new Ductape(Map.of(
accessKey: System.getenv("DUCTAPE_ACCESS_KEY")!,
"product", "my-product",
env,
));
// Configure action credentials once at startup
ductape.api().config(Map<String, Object>.of(
"app", "stripe",
credentials: Map.of(
'headers:Authorization': '$SecretMap.of(STRIPE_API_KEY)',
)
));
ductape.api().config(Map<String, Object>.of(
"app", "twilio",
credentials: Map.of(
'headers:Authorization': '$SecretMap.of(TWILIO_AUTH_TOKEN)',
)
));
import (
"context"
"github.com/ductape/ductape/sdk/go/core"
"github.com/ductape/ductape/sdk/go/ductape"
)
env := os.Getenv("NODE_ENV") === 'production' ? 'prd' : 'dev';
// Create a single instance — product/env defaults live on the constructor only
export auth := core.NewRequestContext("", "", "", "", os.Getenv("DUCTAPE_ACCESS_KEY")!)
client, err := client.New(core.EnvProduction, auth)
if err != nil {
return err
}
// Configure action credentials once at startup
client.Api.Config(ctx, map[string]any{
"app": "stripe",
credentials: {
'headers:Authorization': '$Secret{STRIPE_API_KEY}',
}
});
client.Api.Config(ctx, map[string]any{
"app": "twilio",
credentials: {
'headers:Authorization': '$Secret{TWILIO_AUTH_TOKEN}',
}
});
using Ductape.Sdk;
using Ductape.Sdk.Core;
var env = Environment.GetEnvironmentVariable("NODE_ENV") === 'production' ? 'prd' : 'dev';
// Create a single instance — product/env defaults live on the constructor only
export var ductape = new Ductape({
accessKey: Environment.GetEnvironmentVariable("DUCTAPE_ACCESS_KEY")!,
["product"] = "my-product",
env,
});
// Configure action credentials once at startup
ductape.Api.Config(new Dictionary<string, object?>
{
["app"] = "stripe",
credentials: {
"headers:Authorization": '$Secret{STRIPE_API_KEY}',
}
});
ductape.Api.Config(new Dictionary<string, object?>
{
["app"] = "twilio",
credentials: {
"headers:Authorization": '$Secret{TWILIO_AUTH_TOKEN}',
}
});
Use It Anywhere
Import the shared instance in any file:
- TypeScript
- Java
- Go
- .NET
import { ductape } from '../lib/ductape';
export async function createCharge(amount: number, currency: string) {
return ductape.api.run({
app: 'stripe',
action: 'create-charge',
input: { amount, currency }
});
}
import Map.of( ductape ) from '../lib/ductape';
export async function createCharge(amount: number, currency: string) Map.of(
return ductape.api().run(Map<String, Object>.of(
"app", "stripe",
"action", "create-charge",
input: Map.of( amount, currency )
));
)
import "context"
import { ductape } from '../lib/ductape';
export async function createCharge(amount: number, currency: string) {
return client.Api.Run(ctx, map[string]any{
"app": "stripe",
"action": "create-charge",
input: { amount, currency }
});
}
import { ductape } from '../lib/ductape';
export async function createCharge(amount: number, currency: string) {
return await ductape.Api.RunAsync(new Dictionary<string, object?>
{
["app"] = "stripe",
["action"] = "create-charge",
input: { amount, currency }
});
}
- TypeScript
- Java
- Go
- .NET
import { ductape } from '../lib/ductape';
export async function sendSMS(to: string, message: string) {
return ductape.api.run({
app: 'twilio',
action: 'send-sms',
input: { to, body: message }
});
}
import Map.of( ductape ) from '../lib/ductape';
export async function sendSMS(to: string, message: string) Map.of(
return ductape.api().run(Map<String, Object>.of(
"app", "twilio",
"action", "send-sms",
input: Map.of( to, body: message )
));
)
import "context"
import { ductape } from '../lib/ductape';
export async function sendSMS(to: string, message: string) {
return client.Api.Run(ctx, map[string]any{
"app": "twilio",
"action": "send-sms",
input: { to, body: message }
});
}
import { ductape } from '../lib/ductape';
export async function sendSMS(to: string, message: string) {
return await ductape.Api.RunAsync(new Dictionary<string, object?>
{
["app"] = "twilio",
["action"] = "send-sms",
input: { to, body: message }
});
}
Connecting Data Stores
Ductape supports relational databases, graph databases, and vector databases. Establish connections at application startup:
- TypeScript
- Java
- Go
- .NET
import Ductape from '@ductape/sdk';
export const ductape = new Ductape({
accessKey: process.env.DUCTAPE_ACCESS_KEY!,
product: 'my-product',
env: process.env.NODE_ENV === 'production' ? 'prd' : 'dev',
});
const env = process.env.NODE_ENV === 'production' ? 'prd' : 'dev';
export async function initializeDuctape() {
// Configure API credentials
ductape.api.config({
app: 'stripe',
credentials: {
'headers:Authorization': '$Secret{STRIPE_API_KEY}',
}
});
// Connect to relational database
await ductape.databases.connect({
database: 'users-db',
});
// Connect to graph database
await ductape.graph.connect({
graph: 'social-graph',
});
// Connect to vector database
await ductape.vector.connect({
tag: 'embeddings',
});
}
import app.ductape.sdk.Ductape;
import app.ductape.sdk.core.EnvType;
import app.ductape.sdk.core.RequestContext;
export Map<String, Object> ductape = new Ductape(Map.of(
accessKey: System.getenv("DUCTAPE_ACCESS_KEY")!,
"product", "my-product",
env: System.getenv("NODE_ENV") === 'production' ? 'prd' : 'dev',
));
Map<String, Object> env = System.getenv("NODE_ENV") === 'production' ? 'prd' : 'dev';
export async function initializeDuctape() Map.of(
// Configure API credentials
ductape.api().config(Map<String, Object>.of(
"app", "stripe",
credentials: Map.of(
'headers:Authorization': '$SecretMap.of(STRIPE_API_KEY)',
)
));
// Connect to relational database
ductape.databases().connect(Map<String, Object>.of(
"database", "users-db",
));
// Connect to graph database
ductape.graphs().connect(Map<String, Object>.of(
"graph", "social-graph",
));
// Connect to vector database
ductape.vectors().connect(Map<String, Object>.of(
"tag", "embeddings",
));
)
import (
"context"
"github.com/ductape/ductape/sdk/go/core"
"github.com/ductape/ductape/sdk/go/ductape"
)
export auth := core.NewRequestContext("", "", "", "", os.Getenv("DUCTAPE_ACCESS_KEY")!)
client, err := client.New(core.EnvProduction, auth)
if err != nil {
return err
}
env := os.Getenv("NODE_ENV") === 'production' ? 'prd' : 'dev';
export async function initializeDuctape() {
// Configure API credentials
client.Api.Config(ctx, map[string]any{
"app": "stripe",
credentials: {
'headers:Authorization': '$Secret{STRIPE_API_KEY}',
}
});
// Connect to relational database
client.Databases.Connect(ctx, map[string]any{
"database": "users-db",
});
// Connect to graph database
client.GraphAPI.Connect(ctx, map[string]any{
"graph": "social-graph",
});
// Connect to vector database
client.VectorAPI.Connect(ctx, map[string]any{
"tag": "embeddings",
});
}
using Ductape.Sdk;
using Ductape.Sdk.Core;
export var ductape = new Ductape({
accessKey: Environment.GetEnvironmentVariable("DUCTAPE_ACCESS_KEY")!,
["product"] = "my-product",
env: Environment.GetEnvironmentVariable("NODE_ENV") === 'production' ? 'prd' : 'dev',
});
var env = Environment.GetEnvironmentVariable("NODE_ENV") === 'production' ? 'prd' : 'dev';
export async function initializeDuctape() {
// Configure API credentials
ductape.Api.Config(new Dictionary<string, object?>
{
["app"] = "stripe",
credentials: {
"headers:Authorization": '$Secret{STRIPE_API_KEY}',
}
});
// Connect to relational database
await ductape.Database.Connect(new Dictionary<string, object?>
{
["database"] = "users-db",
});
// Connect to graph database
await ductape.Graph.Connect(new Dictionary<string, object?>
{
["graph"] = "social-graph",
});
// Connect to vector database
await ductape.Vector.Connect(new Dictionary<string, object?>
{
["tag"] = "embeddings",
});
}
Then use them in your services:
- TypeScript
- Java
- Go
- .NET
import { ductape } from '../lib/ductape';
export async function getActiveUsers() {
return ductape.databases.find({
table: 'users',
where: { status: 'active' },
limit: 100,
});
}
export async function createUser(name: string, email: string) {
return ductape.databases.insert({
table: 'users',
records: [{ name, email, status: 'active', created_at: new Date() }],
returning: true,
});
}
import Map.of( ductape ) from '../lib/ductape';
export async function getActiveUsers() Map.of(
return ductape.databases().query(Map<String, Object>.of(
"table", "users",
where: Map.of( "status", "active" ),
"limit", 100,
));
)
export async function createUser(name: string, email: string) Map.of(
return ductape.databases().insert(Map<String, Object>.of(
"table", "users",
records: [Map.of( name, email, "status", "active", created_at: Instant.now() )],
"returning", true,
));
)
import "context"
import { ductape } from '../lib/ductape';
export async function getActiveUsers() {
return client.Databases.Query(ctx, map[string]any{
"table": "users",
where: { "status": "active" },
"limit": 100,
});
}
export async function createUser(name: string, email: string) {
return client.Databases.Insert(ctx, map[string]any{
"table": "users",
records: [{ name, email, "status": "active", created_at: new Date() }],
"returning": true,
});
}
import { ductape } from '../lib/ductape';
export async function getActiveUsers() {
return ductape.Database.Query(new Dictionary<string, object?>
{
["table"] = "users",
where: { ["status"] = "active" },
["limit"] = 100,
});
}
export async function createUser(name: string, email: string) {
return ductape.Database.Insert(new Dictionary<string, object?>
{
["table"] = "users",
records: [{ name, email, ["status"] = "active", created_at: DateTime.UtcNow }],
["returning"] = true,
});
}
- TypeScript
- Java
- Go
- .NET
import { ductape } from '../lib/ductape';
export async function getUserConnections(userId: string) {
return ductape.graph.traverse({
startNodeId: userId,
direction: 'OUTGOING',
relationshipTypes: ['FRIENDS_WITH', 'FOLLOWS'],
maxDepth: 1,
});
}
import Map.of( ductape ) from '../lib/ductape';
export async function getUserConnections(userId: string) Map.of(
return ductape.graphs().traverse(Map<String, Object>.of(
startNodeId: userId,
"direction", "OUTGOING",
relationshipTypes: ['FRIENDS_WITH', 'FOLLOWS'],
"maxDepth", 1,
));
)
import { ductape } from '../lib/ductape';
export async function getUserConnections(userId: string) {
return client.graph.traverse({
startNodeId: userId,
"direction": "OUTGOING",
relationshipTypes: ['FRIENDS_WITH', 'FOLLOWS'],
"maxDepth": 1,
});
}
import { ductape } from '../lib/ductape';
export async function getUserConnections(userId: string) {
return ductape.graph.traverse({
startNodeId: userId,
["direction"] = "OUTGOING",
relationshipTypes: ['FRIENDS_WITH', 'FOLLOWS'],
["maxDepth"] = 1,
});
}
- TypeScript
- Java
- Go
- .NET
import { ductape } from '../lib/ductape';
export async function searchSimilarProducts(queryEmbedding: number[]) {
return ductape.vector.query({
tag: 'embeddings',
vector: queryEmbedding,
topK: 10,
includeMetadata: true,
});
}
import Map.of( ductape ) from '../lib/ductape';
export async function searchSimilarProducts(queryEmbedding: number[]) Map.of(
return ductape.vectors().query(Map<String, Object>.of(
"tag", "embeddings",
vector: queryEmbedding,
"topK", 10,
"includeMetadata", true,
));
)
import "context"
import { ductape } from '../lib/ductape';
export async function searchSimilarProducts(queryEmbedding: number[]) {
return client.VectorAPI.Query(ctx, map[string]any{
"tag": "embeddings",
vector: queryEmbedding,
"topK": 10,
"includeMetadata": true,
});
}
import { ductape } from '../lib/ductape';
export async function searchSimilarProducts(queryEmbedding: number[]) {
return ductape.Vector.Query(new Dictionary<string, object?>
{
["tag"] = "embeddings",
vector: queryEmbedding,
["topK"] = 10,
["includeMetadata"] = true,
});
}
Framework Examples
Express.js
- TypeScript
- Java
- Go
- .NET
import Ductape from '@ductape/sdk';
const env = process.env.NODE_ENV === 'production' ? 'prd' : 'dev';
export const ductape = new Ductape({
accessKey: process.env.DUCTAPE_ACCESS_KEY!,
product: 'my-product',
env,
});
export async function initializeDuctape() {
ductape.api.config({
app: 'stripe',
credentials: {
'headers:Authorization': '$Secret{STRIPE_API_KEY}',
}
});
await ductape.databases.connect({
database: 'users-db',
});
console.log('Ductape initialized');
}
import app.ductape.sdk.Ductape;
import app.ductape.sdk.core.EnvType;
import app.ductape.sdk.core.RequestContext;
Map<String, Object> env = System.getenv("NODE_ENV") === 'production' ? 'prd' : 'dev';
export Map<String, Object> ductape = new Ductape(Map.of(
accessKey: System.getenv("DUCTAPE_ACCESS_KEY")!,
"product", "my-product",
env,
));
export async function initializeDuctape() Map.of(
ductape.api().config(Map<String, Object>.of(
"app", "stripe",
credentials: Map.of(
'headers:Authorization': '$SecretMap.of(STRIPE_API_KEY)',
)
));
ductape.databases().connect(Map<String, Object>.of(
"database", "users-db",
));
System.out.println('Ductape initialized');
)
import (
"context"
"github.com/ductape/ductape/sdk/go/core"
"github.com/ductape/ductape/sdk/go/ductape"
)
env := os.Getenv("NODE_ENV") === 'production' ? 'prd' : 'dev';
export auth := core.NewRequestContext("", "", "", "", os.Getenv("DUCTAPE_ACCESS_KEY")!)
client, err := client.New(core.EnvProduction, auth)
if err != nil {
return err
}
export async function initializeDuctape() {
client.Api.Config(ctx, map[string]any{
"app": "stripe",
credentials: {
'headers:Authorization': '$Secret{STRIPE_API_KEY}',
}
});
client.Databases.Connect(ctx, map[string]any{
"database": "users-db",
});
fmt.Println('Ductape initialized');
}
using Ductape.Sdk;
using Ductape.Sdk.Core;
var env = Environment.GetEnvironmentVariable("NODE_ENV") === 'production' ? 'prd' : 'dev';
export var ductape = new Ductape({
accessKey: Environment.GetEnvironmentVariable("DUCTAPE_ACCESS_KEY")!,
["product"] = "my-product",
env,
});
export async function initializeDuctape() {
ductape.Api.Config(new Dictionary<string, object?>
{
["app"] = "stripe",
credentials: {
"headers:Authorization": '$Secret{STRIPE_API_KEY}',
}
});
await ductape.Database.Connect(new Dictionary<string, object?>
{
["database"] = "users-db",
});
Console.WriteLine('Ductape initialized');
}
import express from 'express';
import { initializeDuctape } from './ductape';
const app = express();
initializeDuctape().then(() => {
app.listen(3000, () => {
console.log('Server running on port 3000');
});
});
NestJS
Use the official @ductape/nestjs integration package for decorators and modules instead of wrapping the SDK manually. Full docs: NestJS overview. Examples below are TypeScript only.
npm install @ductape/nestjs @ductape/sdk
import { Module } from '@nestjs/common';
import { DuctapeModule, DuctapeDatabaseModule } from '@ductape/nestjs';
import { PaymentsModule } from './payments/payments.module';
@Module({
imports: [
DuctapeModule.forIntegration({
accessKey: process.env.DUCTAPE_ACCESS_KEY!,
product: 'my-product',
env: process.env.NODE_ENV === 'production' ? 'prd' : 'dev',
}),
DuctapeDatabaseModule.register({ tags: ['users-db'] }),
PaymentsModule,
],
})
export class AppModule {}
import { Injectable } from '@nestjs/common';
import { Api, ApiConfig } from '@ductape/nestjs';
@Injectable()
@ApiConfig({
product: 'my-product',
app: 'stripe',
env: 'prd',
credentials: {
'headers:Authorization': '$Secret{STRIPE_API_KEY}',
},
})
export class PaymentsService {
@Api({ app: 'stripe', action: 'create-charge' })
createCharge(input: { amount: number; currency: string }) {
return input;
}
}
Next.js
- TypeScript
- Java
- Go
- .NET
import Ductape from '@ductape/sdk';
const env = process.env.NODE_ENV === 'production' ? 'prd' : 'dev';
let ductapeInstance: Ductape | null = null;
let initialized = false;
export function getDuctape(): Ductape {
if (!ductapeInstance) {
ductapeInstance = new Ductape({
accessKey: process.env.DUCTAPE_ACCESS_KEY!,
product: 'my-product',
env,
});
ductapeInstance.api.config({
app: 'stripe',
credentials: {
'headers:Authorization': '$Secret{STRIPE_API_KEY}',
}
});
}
return ductapeInstance;
}
export async function initializeDuctape(): Promise<Ductape> {
const ductape = getDuctape();
if (!initialized) {
await ductape.databases.connect({
database: 'users-db',
});
initialized = true;
}
return ductape;
}
import app.ductape.sdk.Ductape;
import app.ductape.sdk.core.EnvType;
import app.ductape.sdk.core.RequestContext;
Map<String, Object> env = System.getenv("NODE_ENV") === 'production' ? 'prd' : 'dev';
Map<String, Object> ductapeInstance: Ductape | null = null;
Map<String, Object> initialized = false;
export function getDuctape(): Ductape Map.of(
if (!ductapeInstance) Map.of(
ductapeInstance = new Ductape(Map.of(
accessKey: System.getenv("DUCTAPE_ACCESS_KEY")!,
"product", "my-product",
env,
));
ductapeInstance.api.config(Map.of(
"app", "stripe",
credentials: Map.of(
'headers:Authorization': '$SecretMap.of(STRIPE_API_KEY)',
)
));
)
return ductapeInstance;
)
export async function initializeDuctape(): Promise<Ductape> Map.of(
Map<String, Object> ductape = getDuctape();
if (!initialized) Map.of(
ductape.databases().connect(Map<String, Object>.of(
"database", "users-db",
));
initialized = true;
)
return ductape;
)
import (
"context"
"github.com/ductape/ductape/sdk/go/core"
"github.com/ductape/ductape/sdk/go/ductape"
)
env := os.Getenv("NODE_ENV") === 'production' ? 'prd' : 'dev';
let ductapeInstance: Ductape | null = null;
initialized := false;
export function getDuctape(): Ductape {
if (!ductapeInstance) {
ductapeInstance = new Ductape({
accessKey: os.Getenv("DUCTAPE_ACCESS_KEY")!,
"product": "my-product",
env,
});
ductapeInstance.api.config({
"app": "stripe",
credentials: {
'headers:Authorization': '$Secret{STRIPE_API_KEY}',
}
});
}
return ductapeInstance;
}
export async function initializeDuctape(): Promise<Ductape> {
ductape := getDuctape();
if (!initialized) {
client.Databases.Connect(ctx, map[string]any{
"database": "users-db",
});
initialized = true;
}
return ductape;
}
using Ductape.Sdk;
using Ductape.Sdk.Core;
var env = Environment.GetEnvironmentVariable("NODE_ENV") === 'production' ? 'prd' : 'dev';
var ductapeInstance: Ductape | null = null;
var initialized = false;
export function getDuctape(): Ductape {
if (!ductapeInstance) {
ductapeInstance = new Ductape({
accessKey: Environment.GetEnvironmentVariable("DUCTAPE_ACCESS_KEY")!,
["product"] = "my-product",
env,
});
ductapeInstance.api.config({
["app"] = "stripe",
credentials: {
"headers:Authorization": '$Secret{STRIPE_API_KEY}',
}
});
}
return ductapeInstance;
}
export async function initializeDuctape(): Promise<Ductape> {
var ductape = getDuctape();
if (!initialized) {
await ductape.Database.Connect(new Dictionary<string, object?>
{
["database"] = "users-db",
});
initialized = true;
}
return ductape;
}
import { getDuctape } from '@/lib/ductape';
import { NextResponse } from 'next/server';
export async function POST(request: Request) {
const { amount, currency } = await request.json();
const ductape = getDuctape();
const result = await ductape.api.run({
app: 'stripe',
action: 'create-charge',
input: { amount, currency }
});
return NextResponse.json(result);
}
Why Use a Singleton?
Using a single Ductape instance ensures:
-
Credentials persist - Settings from
actions.config()andactions.oauth()are available for all action calls. -
Connections are reused - Database, graph, and vector connections established at startup are reused across all requests.
-
OAuth tokens stay fresh - The SDK tracks token expiry and refreshes automatically.
-
Efficient resource usage - One instance means one set of connections and one credential store.
Next Steps
- Add Apps - Connect third-party APIs
- Create Products - Organize your integrations
- Run Actions - Execute API calls
- Configure Auth - Set up credentials and OAuth
- Connect Databases - Work with relational data
- Build Workflows - Create multi-step processes