Store sources, submit typed operations, and retrieve generated Files with lineage. The same model serves PDF workflows, Office conversions, spreadsheets, and photos.
Dislify keeps the developer model intentionally small: store a File, run an operation, retrieve generated Files, then poll or continue from an event.
Files
Durable sources + outputs
Jobs
Typed async operations
Events
Signed completion hooks
Saved multi-operation workflows
extract_text creates a durable UTF-8 TXT File from PDF/JPG/PNG. Existing meaningful PDF text is reused; other pages use local English OCR. The operation is terminal in workflows. Output is bounded to 2 MiB, with LF/no BOM and form-feed page separators. Download generated Files to read text; Jobs and signed events contain metadata only.
Compose up to five compatible steps such as Office to PDF then compression. POST /api/v1/workflows creates a definition; POST /api/v1/workflows/:id/runs accepts owned File IDs and an Idempotency-Key, returning a workflowRunId immediately. Poll /api/v1/workflow-runs/:id for steps and final outputs.
SDK 0.9.0 is prepared and unpublished: workflows.create, run, wait, retry and downloadZip. Each step uses the normal plan/storage/API quota. Runs keep immutable snapshots; retries accept the failed attempt ID and preserve successful previous steps. Signed job events include workflow correlation. No branching, scheduled invocations or arbitrary HTTP steps.
File-processing quickstart
One lifecycle for every tool.
Store a source File, submit an operation, then poll or continue from a signed webhook. Developer API access requires Unlimited.
// Repository SDK 0.5.0; npm publication is a separate release step.
// npm install @dislify/sdk (use 0.5.0 once it is published)
import { readFile, writeFile } from "node:fs/promises"import { DislifyClient } from "@dislify/sdk"const client = newDislifyClient({ apiKey: process.env.DISLIFY_API_KEY! })
const source = await client.files.upload(
newBlob([awaitreadFile("proposal.docx")]),
{
fileName: "proposal.docx",
contentType:
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
}
)
const submitted = await client.files.convert(source.id, { format: "pdf" })
const result = await client.processing.wait(submitted.id)
for (const output of result.generatedFiles) {
const bytes = await client.files.download(output.id)
await writeFile(output.name, Buffer.from(await bytes.arrayBuffer()))
}
const history = await client.files.get(result.generatedFiles[0].id)
console.log(history.parents.map((file) => file.id))
Running this from the CLI? Use node --env-file=.env app.mjs, or load dotenv/config.
For upload limits, use client.processing.compressPdf(fileId, { targetSizeBytes: 2 * 1024 ** 2, idempotencyKey: "pdf-limit-1" }) or compressImage for JPG/PNG. Choose a target or preset; unreachable targets fail without output.
Office batches return independent child job IDs. Split PDF and PDF-to-images can return multiple generated Files. Sources remain unchanged and retention follows the account plan or connected bucket.
01
Authenticate
POST /api/v1/developers/token with your API key, then keep the returned Bearer token server-side.
02
Create a source File
Prepare a signed upload with POST /api/v1/uploads, upload the bytes, then finalize it with POST /api/v1/files.
03
Submit an operation
Send owned File IDs to POST /api/v1/processing/jobs with one supported operation. The response includes job IDs and an optional batch ID.
04
Read the result
Poll GET /api/v1/processing/jobs/:id or receive a signed job event. Generated Files are durable outputs with source lineage.
05
Download safely
Read File metadata with GET /api/v1/files/:id, then request a short-lived download URL from the File download endpoint.
Processing operations
Browser tools, REST jobs, and SDK helpers share the same operation model.
23 operations
Watermark image
watermark_image
One still JPG / PNG / WebP → One same-format image with a text overlay
One still JPG / PNG → One same-format cropped/rotated File
Options
rotation: 0 | 90 | 180 | 270 clockwise; optional x, y, width, height integer pixels after orientation normalization and rotation; omit all crop fields for full image
Independent batch/retry/ZIP; workflow. Same pixel rectangle per image; out-of-bounds items fail individually. 50 MiB source/output plus plan limits; 8192px side; 20M pixels; no private metadata copied; JPG re-encoded at quality 95.
preset: best_quality | balanced | smaller_file OR targetSizeBytes: integer maximum output bytes; mutually exclusive
Independent jobs for ordered sources; one File per source. Static PDF; 2,000 pages; target 16 KiB minimum and 5–95% of source; plan byte caps; strict target or safe error.
Independent jobs for ordered sources; one File per source. 50 MiB + plan cap; 20M pixels; 8,192 px side; target 16 KiB minimum and 5–95% of source; image queue.
Submit {"fileIds":["source-id"],"operations":[{"type":"compress_pdf","targetSizeBytes":2097152}]}, or use compress_image for JPG/PNG. Choose exactly one of integer targetSizeBytes or preset (best_quality, balanced, smaller_file). Targets are at least 16 KB, 5–95% of the source and within plan/output limits. 1 MB = 1,048,576 bytes. Completion means independently verified stored bytes are at or below the target. An unreachable target or no-savings error creates no output File or output storage charge; try a larger target or preset.
Generic signed events include sanitized target/preset options, source IDs and actual generated File sizes. Failed targets have no successful output. Guests have no account webhook endpoints. SDK 0.5.0 is prepared in the repository; npm publication is a separate release step.
Limits + errors
Developer tokens require Unlimited and the correct scopes. Expect standard 4xx responses for invalid options, ownership, limits, quota, and unsupported formats. Native dispatch failures may transition an accepted job to error.
Idempotency
CSV→XLSX, XLSX→CSV, HEIC→image, Compress PDF and Compress image support Idempotency-Key. Reuse a key only for the same owner, source, and options. Other processing submissions are not retried automatically.
Signed events
Subscribe to job.queued, job.completed, and job.failed. Verify HMAC-SHA256 against the exact raw body and deduplicate by event ID. Delivery is currently best effort without automatic replay.
Current API quotas are 60 job submissions per hour and 10,000 per month for eligible accounts; operation-specific caps and normal storage retention still apply.