activepieces-6-custom-piece-development
Sub-skill of activepieces: 6. Custom Piece Development.
Best use case
activepieces-6-custom-piece-development is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Sub-skill of activepieces: 6. Custom Piece Development.
Teams using activepieces-6-custom-piece-development should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/6-custom-piece-development/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How activepieces-6-custom-piece-development Compares
| Feature / Agent | activepieces-6-custom-piece-development | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Sub-skill of activepieces: 6. Custom Piece Development.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# 6. Custom Piece Development
## 6. Custom Piece Development
```typescript
// pieces/my-custom-api/src/index.ts
import { createPiece, PieceAuth } from '@activepieces/pieces-framework';
import { createCustomResource } from './lib/actions/create-resource';
import { getCustomResource } from './lib/actions/get-resource';
import { listCustomResources } from './lib/actions/list-resources';
import { resourceCreatedTrigger } from './lib/triggers/resource-created';
const authDescription = `
To get your API key:
1. Go to Settings > API Keys in your dashboard
2. Click "Create New Key"
3. Copy the generated key
`;
export const customApiAuth = PieceAuth.SecretText({
displayName: 'API Key',
required: true,
description: authDescription,
validate: async ({ auth }) => {
// Validate the API key
const response = await fetch('https://api.example.com/validate', {
headers: { Authorization: `Bearer ${auth}` }
});
if (!response.ok) {
return {
valid: false,
error: 'Invalid API key'
};
}
return { valid: true };
}
});
export const myCustomApi = createPiece({
displayName: 'My Custom API',
auth: customApiAuth,
minimumSupportedRelease: '0.20.0',
logoUrl: 'https://example.com/logo.png',
authors: ['your-name'],
description: 'Connect to My Custom API for resource management',
actions: [createCustomResource, getCustomResource, listCustomResources],
triggers: [resourceCreatedTrigger]
});
```
```typescript
// pieces/my-custom-api/src/lib/actions/create-resource.ts
import { createAction, Property } from '@activepieces/pieces-framework';
import { customApiAuth } from '../../index';
export const createCustomResource = createAction({
name: 'create_resource',
displayName: 'Create Resource',
description: 'Create a new resource in My Custom API',
auth: customApiAuth,
props: {
name: Property.ShortText({
displayName: 'Resource Name',
required: true,
description: 'The name of the resource'
}),
type: Property.Dropdown({
displayName: 'Resource Type',
required: true,
refreshers: [],
options: async () => ({
options: [
{ label: 'Document', value: 'document' },
{ label: 'Image', value: 'image' },
{ label: 'Video', value: 'video' }
]
})
}),
tags: Property.Array({
displayName: 'Tags',
required: false,
description: 'Tags to categorize the resource'
}),
metadata: Property.Object({
displayName: 'Metadata',
required: false,
description: 'Additional metadata for the resource'
}),
content: Property.LongText({
displayName: 'Content',
required: true,
description: 'The content of the resource'
})
},
async run(context) {
const { auth, propsValue } = context;
const response = await fetch('https://api.example.com/resources', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${auth}`
},
body: JSON.stringify({
name: propsValue.name,
type: propsValue.type,
tags: propsValue.tags || [],
metadata: propsValue.metadata || {},
content: propsValue.content
})
});
if (!response.ok) {
const error = await response.text();
throw new Error(`Failed to create resource: ${error}`);
}
const result = await response.json();
return {
id: result.id,
name: result.name,
type: result.type,
created_at: result.created_at,
url: result.url
};
}
});
```
```typescript
// pieces/my-custom-api/src/lib/triggers/resource-created.ts
import {
createTrigger,
TriggerStrategy,
Property
} from '@activepieces/pieces-framework';
import { customApiAuth } from '../../index';
export const resourceCreatedTrigger = createTrigger({
name: 'resource_created',
displayName: 'Resource Created',
description: 'Triggers when a new resource is created',
auth: customApiAuth,
props: {
resourceType: Property.Dropdown({
displayName: 'Resource Type',
required: false,
refreshers: [],
options: async () => ({
options: [
{ label: 'All Types', value: 'all' },
{ label: 'Document', value: 'document' },
{ label: 'Image', value: 'image' },
{ label: 'Video', value: 'video' }
]
})
})
},
type: TriggerStrategy.WEBHOOK,
async onEnable(context) {
const { auth, propsValue, webhookUrl, store } = context;
// Register webhook with the external API
const response = await fetch('https://api.example.com/webhooks', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${auth}`
},
body: JSON.stringify({
url: webhookUrl,
events: ['resource.created'],
filter: propsValue.resourceType !== 'all'
? { type: propsValue.resourceType }
: undefined
})
});
const webhook = await response.json();
// Store webhook ID for cleanup
await store.put('webhookId', webhook.id);
},
async onDisable(context) {
const { auth, store } = context;
*Content truncated — see parent skill for full reference.*Related Skills
oss-wiki-development-arc
Three-phase methodology (Substrate → Depth → Quality) for building open-source engineering wikis efficiently. Skip 70%+ of empirical iteration cost by pre-loading the pattern.
test-driven-development
Use when implementing any feature or bugfix, before writing implementation code. Enforces RED-GREEN-REFACTOR cycle with test-first approach.
subagent-driven-development
Use when executing implementation plans with independent tasks. Dispatches fresh delegate_task per task with two-stage review (spec compliance then code quality).
cowork-plugin-customizer
Customize or personalize a Codex plugin for a specific organization's tools and workflows by replacing placeholders and configuring MCP servers.
customer-research
Investigate customer questions through multi-source research with confidence scoring and citations
vscode-extensions-5-custom-snippets
Sub-skill of vscode-extensions: 5. Custom Snippets.
raycast-alfred-1-raycast-extension-development
Sub-skill of raycast-alfred: 1. Raycast Extension Development (+2).
docker-6-development-workflow-scripts
Sub-skill of docker: 6. Development Workflow Scripts.
docker-3-docker-compose-for-development
Sub-skill of docker: 3. Docker Compose for Development.
n8n-7-custom-node-development
Sub-skill of n8n: 7. Custom Node Development.
activepieces-integration-with-notion-and-slack
Sub-skill of activepieces: Integration with Notion and Slack.
activepieces-8-error-handling-and-retry-logic
Sub-skill of activepieces: 8. Error Handling and Retry Logic.