Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/dpf-it-com:dpf-it-com-job-triggers-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: DPF Job Triggers API
version: 1.1.0
description: '## Common error responses
Unless otherwise noted, any authenticated endpoint may also return the following
responses, each with the standard `ErrorResponse` body. To avoid repetition they are
not listed individually on each operation:
- **400 Bad Request** — malformed JSON, unknown action, or missing/invalid fields
- **401 Unauthorized** — missing or invalid JWT bearer token
- **402 Payment Required** — the account has insufficient credits or an inactive subscription
- **403 Forbidden** — authenticated but not permitted (no access to the resource, or a higher access level / plan tier is required)
Operation-specific responses (e.g. `404`, `409`) are documented on each endpoint.'
contact:
name: Contact DPF
url: mailto:contact@dpf-it.com
license:
name: Proprietary
url: https://dpf-it.com/#terms
servers:
- url: https://api.dpf-it.com
description: Production API
security: []
tags:
- name: Job Triggers
description: Scheduled ingestion triggers (e.g. SFTP polling) with AI-generated pre/post-processing code
paths:
/job-triggers:
post:
tags:
- Job Triggers
summary: Manage workspace ingestion triggers (SFTP, AWS S3, spec chaining)
description: 'Multi-action endpoint for workspace job triggers. The `action` field determines the operation. Supported trigger `type`s are `sftp`, `aws_s3`, `spec_success`, and `schedule`; for `sftp`/`aws_s3`
the type must match its connection''s type. For `aws_s3`, `s3Bucket` is required (the bucket to
poll) and `s3Prefix` is optional (defaults to the whole bucket). **`aws_s3` listing cap:** each run lists at most 5000 objects from the bucket/prefix, oldest key
first, and stops there. Once a bucket/prefix holds more than 5000 objects, newly delivered files
can fall outside that window and never be seen by the trigger — it will report no new files even
though delivery is working. Mitigate by attaching an S3 lifecycle rule that expires or transitions
older objects out of the prefix so it stays under the cap. `create-trigger` returns a `warnings`
array with this same note whenever `type: aws_s3`. A trigger references a spec (by `specName`) — the **downstream** spec it fires. For `sftp`/
`aws_s3` it also references a connection (by `connectionId`); the natural-language `preRules`
(which files to process) and `postRules` (what to do after upload) are converted by the backend
into **executable JavaScript** (`preCode` / `postCode`) that is returned and shown read-only. Behavior is changed by editing the rules — the code is regenerated; raw code is never accepted
from the client. A separate `dedupe` boolean enables per-spec "don''t load the same file twice": files already
loaded into the spec by a previous run (matched by file name) are skipped. Not applicable to
`spec_success`. An hourly dispatcher runs enabled `sftp`/`aws_s3` triggers according to `frequency`
(`hourly`, `daily` + `hourOfDay`, or `monthly` + `dayOfMonth` + `hourOfDay`; all UTC). The
referenced spec must already have been analyzed once (it must have transformation code) —
a trigger feeds an analyzed spec, it does not bootstrap one. `spec_success` triggers fire reactively instead: when the spec named by `upstreamSpecId`/
`upstreamSpecName` completes a successful job, its downstream spec (`specName`) is run
automatically — no `frequency`/`connectionId`. Chains that would create a cycle (directly or
through other `spec_success` triggers) are rejected with 409 `CYCLE_DETECTED`. `schedule` triggers fire on a plain cron-like `frequency` like sftp/aws_s3, but with no
connection — the spec''s job is fired directly rather than pulling files. Use this for a
table-source spec that should re-run periodically rather than (or in addition to) being
chained off an upstream spec''s success. Both `spec_success` and `schedule` downstream specs (`specName`) must be table-source
(`sourceType: ''tables''`) specs — each run re-executes the spec''s generated SQL query, windowed
to rows since its last successful run, so there is no file for either trigger type to load. **Actions:**
- **create-trigger**: Validate the spec (+ connection, for sftp/aws_s3), generate `preCode`/
`postCode` from the rules (sftp/aws_s3 only), persist, and return the trigger. - Requires: JWT token, full access to the workspace
- Fields: `workspaceId`, `type` (`sftp`, `aws_s3`, `spec_success`, or `schedule`), `specName`;
for sftp/aws_s3: `connectionId`, `frequency`, optional `preRules`, `postRules`, `dedupe`;
`s3Bucket` (required)/`s3Prefix` (optional) when `type: aws_s3`; for spec_success:
`upstreamSpecName`; for schedule: `frequency`; `enabled` optional for all types. - For sftp/aws_s3, the connection''s most recent `lastTestStatus` must be `passed` (see the
`Connection` schema) — returns 400 `CONNECTION_NOT_TESTED` otherwise. - Returns: the created trigger (with `preCode`/`postCode` for sftp/aws_s3) with status 201. For `type: aws_s3`, the response also includes a `warnings` array noting the 5000-object
listing cap described above. - **get-triggers**: List all triggers for a workspace (each includes `preCode`/`postCode`).'
operationId: manageJobTriggers
security:
- BearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/CreateTriggerRequest'
- $ref: '#/components/schemas/GetTriggersRequest'
- $ref: '#/components/schemas/UpdateTriggerRequest'
- $ref: '#/components/schemas/DeleteTriggerRequest'
- $ref: '#/components/schemas/RunTriggerNowRequest'
- $ref: '#/components/schemas/ClearProcessedFilesRequest'
examples:
createTrigger:
summary: Create an SFTP trigger
value:
action: create-trigger
workspaceId: 550e8400-e29b-41d4-a716-446655440000
type: sftp
specName: web-logs
connectionId: 7b3f8a10-1c2d-4e5f-9a0b-1c2d3e4f5a6b
frequency:
unit: daily
hourOfDay: 6
dedupe: true
preRules: Process only *.csv files under /outbound
postRules: Rename each processed file with a .done suffix
createAwsS3Trigger:
summary: Create an aws_s3 trigger
value:
action: create-trigger
workspaceId: 550e8400-e29b-41d4-a716-446655440000
type: aws_s3
specName: web-logs
connectionId: 7b3f8a10-1c2d-4e5f-9a0b-1c2d3e4f5a6b
s3Bucket: customer-data-bucket
s3Prefix: exports/daily/
frequency:
unit: daily
hourOfDay: 6
dedupe: true
createSpecSuccessTrigger:
summary: Chain a table-source spec off another spec's success
value:
action: create-trigger
workspaceId: 550e8400-e29b-41d4-a716-446655440000
type: spec_success
specName: daily-signups-aggregate
upstreamSpecName: daily-signups-load
createScheduleTrigger:
summary: Run a table-source spec on a plain schedule (no upstream spec)
value:
action: create-trigger
workspaceId: 550e8400-e29b-41d4-a716-446655440000
type: schedule
specName: daily-signups-aggregate
frequency:
unit: daily
hourOfDay: 7
getTriggers:
summary: List triggers
value:
action: get-triggers
workspaceId: 550e8400-e29b-41d4-a716-446655440000
runTriggerNow:
summary: Fire a trigger now
value:
action: run-trigger-now
workspaceId: 550e8400-e29b-41d4-a716-446655440000
triggerId: 9c1e2d3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f
responses:
'200':
description: Triggers listed, updated, deleted, or run history returned
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/GetTriggersResponse'
- $ref: '#/components/schemas/UpdateTriggerResponse'
- $ref: '#/components/schemas/DeleteTriggerResponse'
- $ref: '#/components/schemas/ClearProcessedFilesResponse'
'201':
description: Trigger created (includes generated preCode/postCode)
content:
application/json:
schema:
$ref: '#/components/schemas/CreateTriggerResponse'
'202':
description: Trigger run started
content:
application/json:
schema:
$ref: '#/components/schemas/RunTriggerNowResponse'
'403':
description: No access, or read-only access attempting a mutating action
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
'404':
description: Trigger, spec, or connection not found
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
components:
schemas:
ErrorResponse:
type: object
required:
- error
properties:
error:
type: object
required:
- code
- message
properties:
code:
type: string
description: Machine-readable error code
example: INVALID_EMAIL
message:
type: string
description: Human-readable error message
example: Invalid email format
DeleteTriggerRequest:
type: object
required:
- action
- workspaceId
- triggerId
properties:
action:
type: string
enum:
- delete-trigger
workspaceId:
type: string
format: uuid
triggerId:
type: string
format: uuid
RunTriggerNowRequest:
type: object
required:
- action
- workspaceId
- triggerId
properties:
action:
type: string
enum:
- run-trigger-now
workspaceId:
type: string
format: uuid
triggerId:
type: string
format: uuid
ClearProcessedFilesResponse:
type: object
properties:
success:
type: boolean
example: true
data:
type: object
properties:
triggerId:
type: string
format: uuid
deleted:
type: integer
description: Number of processed-file ledger records deleted.
example: 12
message:
type: string
example: Cleared 12 processed file record(s)
CreateTriggerRequest:
type: object
description: '`connectionId`/`frequency` are required when `type` is `sftp`/`aws_s3` (the
default). `upstreamSpecName` is required instead when `type` is
`spec_success`. `frequency` is required instead when `type` is `schedule`
(no connection or upstream spec). Both `spec_success` and `schedule` require
the downstream spec (`specName`) to already be a table-source
(`sourceType: ''tables''`) or compaction (`sourceType: ''compaction''`) spec.
'
required:
- action
- workspaceId
- specName
properties:
action:
type: string
enum:
- create-trigger
workspaceId:
type: string
format: uuid
type:
type: string
enum:
- sftp
- aws_s3
- spec_success
- schedule
description: Defaults to "sftp". For sftp/aws_s3 must match the referenced connection's type.
specName:
type: string
description: The (downstream) spec this trigger fires.
example: web-logs
connectionId:
type: string
format: uuid
description: Required when type is "sftp" or "aws_s3".
s3Bucket:
type: string
description: Required when type is "aws_s3". The bucket this trigger polls.
example: customer-data-bucket
s3Prefix:
type: string
description: Optional when type is "aws_s3"; defaults to the whole bucket. Ignored otherwise.
example: exports/daily/
frequency:
allOf:
- $ref: '#/components/schemas/TriggerFrequency'
description: Required when type is "sftp", "aws_s3", or "schedule". Not applicable to spec_success.
upstreamSpecName:
type: string
description: Required when type is "spec_success" — the spec whose successful job completion fires this trigger.
example: daily-signups-load
preRules:
type: string
postRules:
type: string
dedupe:
type: boolean
description: Defaults to false.
enabled:
type: boolean
description: Defaults to true.
GetTriggersRequest:
type: object
required:
- action
- workspaceId
properties:
action:
type: string
enum:
- get-triggers
workspaceId:
type: string
format: uuid
JobTrigger:
type: object
description: 'A workspace ingestion trigger. `preCode`/`postCode` are the JavaScript
generated from `preRules`/`postRules`; they are read-only (regenerated when
the rules change) and are always included in responses.
`spec_success` triggers fire when another spec''s job completes successfully
(`upstreamSpecId`/`upstreamSpecName`) instead of polling a connection — they
have no `connectionId`/`frequency`/`preRules`/`postRules`/s3 fields. `schedule`
triggers fire a spec directly on a plain cron-like schedule (`frequency`,
same as sftp/aws_s3) with no connection and no upstream spec. Both
`spec_success` and `schedule` require the trigger''s own `specId`/`specName`
(the spec fired) to be a table-source (`sourceType: ''tables''`) or compaction
(`sourceType: ''compaction''`) spec, since neither supplies a new file for a
file-source spec to load — a table-source spec re-runs its generated query,
windowed to rows since its last successful run, and a compaction spec re-compacts
its tables, so both are just different ways to decide *when* to re-run them.
'
properties:
triggerId:
type: string
format: uuid
example: 9c1e2d3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f
workspaceId:
type: string
format: uuid
example: 550e8400-e29b-41d4-a716-446655440000
type:
type: string
enum:
- sftp
- aws_s3
- spec_success
- schedule
example: sftp
specId:
type: string
format: uuid
description: The (downstream) spec this trigger fires.
specName:
type: string
example: web-logs
connectionId:
type: string
format: uuid
description: sftp/aws_s3 only.
example: 7b3f8a10-1c2d-4e5f-9a0b-1c2d3e4f5a6b
s3Bucket:
type: string
description: aws_s3 only, required for that type. The bucket this trigger polls.
example: customer-data-bucket
s3Prefix:
type: string
description: aws_s3 only. Optional key prefix; defaults to the whole bucket.
example: exports/daily/
upstreamSpecId:
type:
- string
- 'null'
format: uuid
description: spec_success only — the spec whose successful job completion fires this trigger.
upstreamSpecName:
type:
- string
- 'null'
example: daily-signups-load
description: spec_success only — denormalized name of upstreamSpecId, for display.
frequency:
$ref: '#/components/schemas/TriggerFrequency'
preRules:
type: string
description: Natural-language "which files to process" prompt (may be empty).
example: Process only *.csv files under /outbound
postRules:
type: string
description: Natural-language "what to do after upload" prompt (may be empty).
example: Rename each processed file with a .done suffix
preCode:
type: string
description: Generated body of async selectFiles(files, ctx). Read-only.
postCode:
type: string
description: Generated body of async postProcess(sftp, files, ctx). Read-only.
dedupe:
type: boolean
description: Skip files already loaded into this spec (per-spec, matched by file name).
example: true
enabled:
type: boolean
example: true
createdBy:
type: string
format: uuid
createdAt:
type: integer
format: int64
description: Unix timestamp in milliseconds
updatedAt:
type: integer
format: int64
description: Unix timestamp in milliseconds
lastRunAt:
type:
- integer
- 'null'
format: int64
description: Unix timestamp in milliseconds of the last run (absent if never run).
lastRunStatus:
type:
- string
- 'null'
enum:
- running
- success
- failed
- no-files
- null
lastJobId:
type:
- string
- 'null'
format: uuid
warnings:
type: array
items:
type: string
description: create-trigger only, aws_s3 only. Advisory notes about the created trigger — currently just the 5000-object S3 listing cap. Absent on get/update/delete responses and on other types.
example:
- Each run lists at most 5000 objects from this bucket/prefix, oldest key first. Once it holds more than 5000 objects, newly delivered files can fall outside that window and be missed entirely. Configure an S3 lifecycle rule to expire or transition older objects out of this prefix so it stays under the cap.
UpdateTriggerResponse:
type: object
properties:
success:
type: boolean
example: true
data:
$ref: '#/components/schemas/JobTrigger'
TriggerFrequency:
type: object
description: 'Polling cadence, evaluated in UTC by the hourly dispatcher.
`hourOfDay` is required for `daily`/`monthly`; `dayOfMonth` for `monthly`.
'
required:
- unit
properties:
unit:
type: string
enum:
- hourly
- daily
- monthly
example: daily
hourOfDay:
type: integer
minimum: 0
maximum: 23
description: Hour of day (UTC). Required for daily and monthly.
example: 6
dayOfMonth:
type: integer
minimum: 1
maximum: 31
description: Day of month. Required for monthly.
example: 1
GetTriggersResponse:
type: object
properties:
success:
type: boolean
example: true
data:
type: object
properties:
triggers:
type: array
items:
$ref: '#/components/schemas/JobTrigger'
count:
type: integer
example: 1
ClearProcessedFilesRequest:
type: object
required:
- action
- workspaceId
- triggerId
properties:
action:
type: string
enum:
- clear-processed-files
workspaceId:
type: string
format: uuid
triggerId:
type: string
format: uuid
RunTriggerNowResponse:
type: object
properties:
success:
type: boolean
example: true
data:
type: object
properties:
triggerId:
type: string
format: uuid
message:
type: string
example: Trigger run started
DeleteTriggerResponse:
type: object
properties:
success:
type: boolean
example: true
data:
type: object
properties:
triggerId:
type: string
format: uuid
message:
type: string
example: Trigger deleted successfully
CreateTriggerResponse:
type: object
properties:
success:
type: boolean
example: true
data:
$ref: '#/components/schemas/JobTrigger'
UpdateTriggerRequest:
type: object
description: 'Partial update. Changing `preRules`, `postRules`, or `dedupe` regenerates
`preCode`/`postCode`. Raw code is never accepted. `s3Bucket`/`s3Prefix` only apply
to (and are only accepted for) an existing `aws_s3` trigger. `upstreamSpecName`
only applies to (and is only accepted for) an existing `spec_success` trigger,
and is re-validated for cycles just like create-trigger. `frequency` applies to
sftp/aws_s3/schedule triggers. A trigger''s `type` cannot be changed.
'
required:
- action
- workspaceId
- triggerId
properties:
action:
type: string
enum:
- update-trigger
workspaceId:
type: string
format: uuid
triggerId:
type: string
format: uuid
frequency:
$ref: '#/components/schemas/TriggerFrequency'
preRules:
type: string
postRules:
type: string
dedupe:
type: boolean
enabled:
type: boolean
s3Bucket:
type: string
description: aws_s3 triggers only.
example: customer-data-bucket
s3Prefix:
type: string
description: aws_s3 triggers only.
example: exports/daily/
upstreamSpecName:
type: string
description: spec_success triggers only. Re-points the trigger at a different upstream spec.
example: daily-signups-load
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
description: JWT token obtained from login or registration