Iyctt developer guide
Everything you need to deploy your first workflow and grow into a production-scale automation platform.
About the name. Iyctt is short for “If You Can’T Tell” — the idea that great automation should be invisible to the people it serves.
Quickstart
Deploy your first workflow in under five minutes.
$ npm i -g @iyctt/cli
$ iyctt login
$ iyctt init my-flow
$ cd my-flow && iyctt deploy
Install the CLI
The Iyctt CLI runs on Node 18+ and is distributed via npm:
npm install --global @iyctt/cli
~/.config/iyctt/. On
shared machines, prefer per-project tokens over global login.
Authentication
All API requests require a bearer token scoped to a project:
Authorization: Bearer sk_live_2n8fJq...
Create scoped API keys from the dashboard. Keys can be restricted to specific workflows and IP ranges.
Workflows
A workflow is a typed handler that runs on a trigger:
import { defineWorkflow } from "@iyctt/sdk";
export default defineWorkflow({
name: "welcome-email",
trigger: { source: "user.created" },
async handler(event, ctx) {
await ctx.email.send({ to: event.email, template: "welcome" });
},
});
Webhooks
Inbound webhooks are signed with HMAC-SHA256 using a per-source secret.
Verify signatures with the SDK:
import { verifyWebhook } from "@iyctt/sdk/webhooks";
const ok = await verifyWebhook(request, env("WEBHOOK_SECRET"));
if (!ok) return new Response("unauthorized", { status: 401 });
Retries & idempotency
Every workflow invocation includes an Idempotency-Key that
Iyctt uses to deduplicate replays. Failed steps back off
exponentially and are checkpointed to durable state.
| Setting | Default | Description |
|---|---|---|
retries.max | 3 | Maximum retry attempts per step |
retries.backoff | exponential | Backoff strategy (linear or exponential) |
retries.jitter | 0.2 | Fractional jitter, 0.0–1.0 |
API reference
The API is versioned in the URL. All endpoints return JSON.
| Method | Path | Description |
|---|---|---|
POST | /v1/flows | Deploy or update a workflow |
GET | /v1/flows/{name} | Fetch a workflow |
POST | /v1/flows/{name}/run | Invoke a workflow |
GET | /v1/runs/{run_id} | Fetch a run |
POST | /v1/runs/{run_id}/replay | Replay a failed run |
Error codes
Errors follow a stable schema. Client SDKs surface them as typed exceptions.
{
"error": {
"code": "validation_failed",
"message": "One or more fields are invalid.",
"details": { "trigger": "Unknown source: github.pull" }
}
}
Rate limits
Rate limits are enforced per project. When exceeded, the API returns
429 Too Many Requests with a Retry-After
header.
/v1/flows/{name}/run endpoint has a per-second
burst limit. For bulk workloads, publish to a queue instead of
invoking directly.
SDKs
@iyctt/sdk— TypeScript / JavaScriptgithub.com/iyctt/go-sdk— Goiyctt— Python (PyPI)
All SDKs are generated from the same OpenAPI spec and released in lockstep.