Connectors
Connect your app to third-party services like Slack, Resend, and ElevenLabs. Credentials are encrypted and actions are pre-authenticated.
Connectors let you integrate external services into your app without managing raw API keys in code. You set up a connection once, bind it to your project, and call pre-built actions from your app. Credentials are encrypted at rest and never exposed to your frontend code.
Available connectors
Section titled “Available connectors”| Connector | Category | Auth type | What it does |
|---|---|---|---|
| Resend | Communications | API key | Send transactional email, send batch emails, list verified domains |
| Slack | Communications | OAuth | Post messages, list channels and users, react to messages, read threads |
| ElevenLabs | AI | API key | Text-to-speech, list available voices, generate sound effects |
More connectors are being added regularly.
How connectors work
Section titled “How connectors work”- You create a connection — provide credentials (an API key or sign in via OAuth)
- You bind the connection to a project — this authorizes the project to use those credentials
- Your app calls actions — the request goes through Proyecta Cloud, which injects the credentials server-side
Your app code never touches the raw API key or OAuth token. The connector system handles authentication, rate limiting, and audit logging.
Set up a connector
Section titled “Set up a connector”- Open your project in the builder
- Go to Settings > Connectors
- Click a connector from the catalog (e.g., Resend)
- Enter your credentials:
- API key connectors (Resend, ElevenLabs): Paste your secret key
- OAuth connectors (Slack): Sign in and authorize access
- Give the connection a name (e.g., “Production Resend”)
- The connection is tested automatically and marked Active if valid
Read through a connector from your app
Section titled “Read through a connector from your app”Your app can read a third-party API directly from the browser without the API key ever reaching the bundle. The credential stays encrypted on the platform; your app only names the connector, the action, and a typed input, and the platform makes the call for you.
import { useConnectorData, useHttpRead } from '@/hooks/useConnector.ts';
// A connector's own read action, as a cached queryconst { data, isLoading, error } = useConnectorData('eleven-labs', 'listVoices');
// The generic HTTP-read connector, by endpoint nameconst { data: feed } = useHttpRead('news-feed', { limit: 10 });Two guardrails are worth knowing, because they’re deliberate:
- Reads only. Only actions the platform has marked browser-safe are reachable — anything else returns
403. Writes (posting to Slack, sending mail, charging a card) are never browser-reachable. - You cannot pass a URL or a host. For the generic
http-readconnector the input is{ endpointKey, params }, and the URL behindendpointKeyis configured by you, the app owner — not by app code. Responses are cached server-side and rate limited, since third-party keys are quota-metered.
A 404 means the owner hasn’t connected that connector yet — that’s the case worth handling in your UI.
Let the AI wire it up
Section titled “Let the AI wire it up”You don’t have to write connector code by hand. The AI builder knows which connectors are bound to your project and can generate the integration for you:
"Send a welcome email when users sign up"— uses the Resend connector"Post a Slack message when a new order comes in"— uses the Slack connector"Play audio narration on the article page"— uses the ElevenLabs connector
Connector actions reference
Section titled “Connector actions reference”Resend (connectorId: 'resend')
Section titled “Resend (connectorId: 'resend')”| Action | Side effects | Description |
|---|---|---|
sendEmail |
write | Send a single transactional email |
sendBatch |
write | Send multiple emails at once |
listDomains |
read | List verified sending domains |
Slack (connectorId: 'slack')
Section titled “Slack (connectorId: 'slack')”| Action | Side effects | Description |
|---|---|---|
postMessage |
write | Post a message to a channel |
listChannels |
read | List channels in the workspace |
listUsers |
read | List workspace members |
reactToMessage |
write | Add an emoji reaction |
getThread |
read | Get replies in a thread |
ElevenLabs (connectorId: 'eleven-labs')
Section titled “ElevenLabs (connectorId: 'eleven-labs')”| Action | Side effects | Description |
|---|---|---|
textToSpeech |
write | Convert text to speech audio |
listVoices |
read | List available voices |
generateSoundEffect |
write | Generate an AI sound effect |
Connection statuses
Section titled “Connection statuses”| Status | Meaning |
|---|---|
| Active | Credentials are valid and the connection is ready to use |
| Broken | Credentials expired or were revoked — update them to restore |
Security
Section titled “Security”- Credentials are encrypted with AES-256-GCM at rest
- Actions are rate-limited to 1,000 requests per minute per connector per project
- Every action call is logged with an audit trail (connection, action, duration, status)
- Connections are scoped to the entire workspace
Can I use the same connection across multiple projects?
Yes. Create the connection once and bind it to any number of projects in the same workspace.
What happens if my API key expires or is revoked?
The connection status changes to Broken. Update the credentials in Settings > Connectors to restore it.
Can I call connector actions from the frontend?
Your app never holds them. Browser-safe read actions are proxied through Proyecta Cloud, which injects the credentials server-side, so the key is never in your bundle. Write actions aren’t reachable from the browser at all.
Can I add my own custom connectors?
Not yet. Custom connector definitions are on the roadmap.
Coming soon
Section titled “Coming soon”- Additional connectors (Google, Twilio, SendGrid, and more)
- Custom connector definitions — bring your own API
- Webhook ingestion for incoming events from connected services
- OAuth gateway — keep tokens server-side even for client-initiated flows