Workflow API
Scheduled recurring operations that run automatically until conditions are met. Perfect for monitoring, alerting, and automated data collection.
Lifecycle: active → paused → completed/failed
Credits: 1 credit/execution (basic) | 2 credits (with NL condition) | Variable for multi-step/AI-planned
Workflow Modes
| Mode | Description | Key Config |
|---|---|---|
simple | Single search/crawl per execution (default) | workflow_type, operation_config |
multi_step | Explicit pipeline with dependencies | steps[] array |
ai_planned | AI generates pipeline from natural language | intent, max_credits_per_execution |
Step Types (for multi_step mode)
| Type | Description | Config Fields |
|---|---|---|
search | Web search | query, max_results, query_decomposition |
crawl | Web crawling | urls, max_pages, extraction_schema |
aggregate | Combine/summarize | aggregation_type, format |
Step Dependencies: depends_on (array of step IDs), output_key (reference name), cascade_condition (conditional execution)
GET /api/v1/workflows/assess-intent
Get documentation for the intent assessment endpoint.
POST /api/v1/workflows/assess-intent
Assess if a monitoring intent is specific enough to execute reliably. Returns specificity score, identifies vague aspects, and proposes clearer rewrites for vague intents. FREE (no credits charged).
| Parameter | Type | Default | Description |
|---|---|---|---|
intent | String | required | The monitoring intent to assess (10-2000 chars) |
timeout | Number | 10000 | Timeout in milliseconds (1000-30000) |
Rate Limit: 10 requests per hour per user
Response:
| Field | Type | Description |
|---|---|---|
assessment | String | specific or vague |
specificity_score | Number | 1-10 (7+ is specific enough) |
is_assessed | Boolean | Whether the intent was actually evaluated (false = system failure, not an assessment) |
assessment_source | String | llm, heuristic, or fallback |
fallback_reason_code | String | timeout, parse_error, provider_error, rate_limited (only when assessment_source !== llm) |
vague_aspects | String[] | What's unclear (only if vague) |
proposed_intent | String | Clearer rewrite (only if vague) |
what_we_clarified | String[] | What was improved (only if vague) |
inferred | Object | Advisory metadata for workflow generation |
reasoning | String | Brief explanation |
Assessment Source:
assessment_source | is_assessed | Meaning |
|---|---|---|
llm | true | Full LLM assessment completed |
heuristic | true | Rate-limited, used pattern matching (still a real assessment) |
fallback | false | LLM call failed — this is NOT an assessment. Defaults to specific/7 to avoid blocking the user. |
Inferred Metadata:
| Field | Type | Description |
|---|---|---|
trigger_conditions | String[] | What events fire alerts |
exclusions | String[] | What should NOT trigger alerts |
entities | String[] | Key things to track |
source_types | String[] | Where to look |
suggested_cadence | String | hourly, daily, weekly, monthly |
monitoring_type | String[] | event_detection, change_tracking, threshold_alert, ranking, aggregation |
extraction_fields | String[] | Fields to extract (if specified) |
Example:
curl -X POST https://www.zipf.ai/api/v1/workflows/assess-intent \
-H "Authorization: Bearer wvr_TOKEN" \
-H "Content-Type: application/json" \
-d '{"intent": "Tell me when a new LLM releases"}'
Returns assessment: "vague", specificity_score: 3, a proposed_intent rewrite, and inferred metadata (trigger conditions, entities, suggested cadence, etc.).
GET /api/v1/workflows/plan
Get information about workflow planning capabilities.
POST /api/v1/workflows/plan
Preview AI-planned workflow before creating. Supports iterative phased planning (discover → research → generate) or one-shot full pipeline (backward-compatible default).
Credits: Variable based on planning preset — only actually-consumed credits are charged. Preset budgets: quick (~10), standard (~30), thorough (~50), comprehensive (~100). Returns 402 if insufficient credits.
Core Parameters
| Parameter | Type | Description |
|---|---|---|
intent | String (required) | Natural language description (10-2000 chars) |
name | String | Optional workflow name |
max_credits_per_execution | Number | Execution budget limit |
planning_budget | Number | Planner budget hint (takes precedence over max_credits_per_execution) |
quality_mode | String | quality_first (default) or balanced |
skip_entity_discovery | Boolean | Skip entity discovery for faster response |
Phased Planning Parameters
| Parameter | Type | Description |
|---|---|---|
phase | String | discover, research, or generate. Omit for full pipeline (default). |
planning_session_id | UUID | Resume from a previous phase. Required for research/generate phases. |
entity_overrides | Object | {add: [{name, type}], remove: [name]} — correct entities before research. |
research_feedback | String | Free-form guidance for research (e.g., "focus on enterprise"). |
source_overrides | Object | {add: [url], remove: [url]} — add/remove source URLs. |
generation_overrides | Object | {topology_preference, step_guidance, max_steps} — guide generation. |
Phased Planning Flow
POST /plan {intent, phase: "discover"}
→ returns entities[], planning_session_id
POST /plan {planning_session_id, phase: "research", entity_overrides?}
→ returns enrichment, classification, planning_results
POST /plan {planning_session_id, phase: "generate", generation_overrides?}
→ returns workflow steps, validation
POST /workflows {planning_session_id, mode: "ai_planned", stop_condition, interval}
→ creates workflow from accumulated session state (no re-planning)
Planning sessions expire after 2 hours. Sessions linked to created workflows are kept permanently.
Phase Response Shape
Each phase response includes: planning_session_id, phase, phase_complete, next_phase, credits.consumed_this_phase, credits.total_consumed.
Full Pipeline Response (phase omitted)
Response includes: planning_profile (precision_linear | dual_lane_hybrid | fork_join_dag), topology_reason, planning_quality_score, planning_overhead_ratio, coverage_score, depth_score, coverage_gaps.
GET /api/v1/workflows/plan/{session_id}
Retrieve the current state of a planning session. Useful for session recovery after disconnect, or inspecting accumulated state between phased planning calls.
Authentication: Bearer token required. Only the session owner can access their sessions.
Response: Returns full session state including current_phase, accumulated phase outputs (entities, enrichment, classification, workflow_definition, reasoning_trace, validation), any overrides applied, credits_consumed, and expires_at (2-hour TTL).
Errors: 400 if session expired, 404 if not found or not owned by caller.
GET /api/v1/workflows/plan/stream
Get information about the streaming planning endpoint.
POST /api/v1/workflows/plan/stream
Stream planning progress via SSE. Same parameters as POST /api/v1/workflows/plan.
Key Events: started, entity_discovered, entity_enriched, workflow_generated, complete, error, heartbeat (every 15s)
GET /api/v1/workflows
List workflows with pagination.
Query Parameters:
limit(Int) - Results per page (1-100)offset(Int) - Pagination offsetstatus(String) - Filter by status:active,paused,completed,failed
GET /api/v1/workflows/analytics
Get aggregate workflow analytics across all workflows the caller can access (owned workflows + optionally org-shared workflows).
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
range | String | 7d | Time window: 1d, 7d, 30d, or all |
include_shared | Boolean | true | Include org-shared workflows accessible to the caller |
status | String (CSV) | - | Optional workflow status filter |
mode | String (CSV) | - | Optional workflow mode filter |
workflow_type | String (CSV) | - | Optional workflow type filter |
Response includes: totals (workflows, executions, success rate, credits, tokens, estimated time saved), timing (avg/p50/p95 duration, start/completion adherence), composition (breakdown by mode), series (time-bucketed executions and tokens).
Bucketing: 1d = hourly UTC buckets, 7d/30d = daily UTC buckets, all = monthly UTC buckets.
GET /api/v1/workflows/resume-all
Get counts of workflows paused by reason and documentation for the resume endpoint.
Response includes:
current_paused_counts- Count of paused workflows by reason (credits_exhausted,subscription_expired,rate_limited)total_paused_auto- Total count of auto-paused workflows
POST /api/v1/workflows/resume-all
Resume all workflows that were auto-paused due to a specific reason. Recalculates next_execution_at for each resumed workflow.
| Parameter | Type | Required | Description |
|---|---|---|---|
pause_reason | String | No | Filter by reason: credits_exhausted, subscription_expired, rate_limited. If not provided, resumes all auto-paused workflows. |
Response includes:
resumed_count- Number of workflows resumedworkflows[]- Array of resumed workflows withid,name,next_execution_atcredits.balance_after- Current credit balancecredits.estimated_cost_next_execution- Rough estimate for next execution cyclewarning- Warning message if credits are still low
Example:
# Resume all credit-paused workflows
curl -X POST https://www.zipf.ai/api/v1/workflows/resume-all \
-H "Authorization: Bearer wvr_TOKEN" \
-H "Content-Type: application/json" \
-d '{"pause_reason": "credits_exhausted"}'
POST /api/v1/workflows
Create a new workflow.
Core Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
name | String | Yes | Workflow name (max 255 chars) |
mode | String | No | simple (default), multi_step, ai_planned |
stop_condition | Object | Yes | When to complete workflow |
recency_confidence_threshold | Number | No | Content recency filter confidence (0-1). Default: 0.50. Lower = more aggressive filtering. |
dry_run | Boolean | No | Estimate cost without creating |
Mode-Specific Parameters
Simple mode: workflow_type (search/crawl), operation_config
Multi-step: steps[] array
AI-planned: intent, max_credits_per_execution
Schedule Configuration (one required)
| Parameter | Description | Example |
|---|---|---|
interval | Human-readable interval string | "30 minutes", "6 hours", "1 day", "2 weeks" |
interval_minutes | Raw minutes (min: 1) — takes precedence over interval | 60 |
cron_expression | 5-field cron format | "0 9 * * MON,WED,FRI" |
scheduled_for | One-time ISO 8601 datetime | "2025-01-15T15:00:00Z" |
anchor_minute | Align to specific minute (0-59) | 0 (run at :00) |
timezone | IANA timezone (default: UTC) | "America/New_York" |
Interval formats: interval accepts "N unit" where unit is minutes, hours, days, or weeks (singular or plural). If both interval and interval_minutes are provided, interval_minutes takes precedence.
Stop Condition Types
| Type | Description | Key Fields |
|---|---|---|
result_count | Result count meets condition | operator (>,<,>=,<=,==), value |
contains_url | Results contain specific URL | url |
field_value | Field matches value | field, operator, value |
extracted_field | Extracted crawl field matches | field, operator, value |
natural_language | LLM evaluates condition | description, confidence_threshold (default: 0.7) |
always | Never auto-stop | - |
NL Confidence Guide: High (0.8-0.9) = strong evidence only | Medium (0.6-0.7) = balanced | Low (0.4-0.5) = permissive
GET /api/v1/workflows/{id}
Get workflow details with recent executions.
PATCH /api/v1/workflows/{id}
Update workflow parameters.
Editable Fields: name, workflow_type, operation_config, stop_condition, interval_minutes, max_executions, status, session_id, email_config, slack_config, notification_settings, recency_confidence_threshold
DELETE /api/v1/workflows/{id}
Delete a workflow and stop scheduled executions.
GET /api/v1/workflows/{id}/details
Get comprehensive workflow information including stats, configuration, and notification intelligence.
Response includes:
notification_settings- Suppression configuration (suppression_threshold)notification_stats- Suppression metrics:total_executions- Total executions trackednotifications_sent- Notifications deliverednotifications_suppressed- Notifications filtered as low-valuesuppression_rate- Percentage of noise reductionlast_suppression_reason- Most recent suppression reason
POST /api/v1/workflows/{id}/execute
Execute workflow immediately. Does not affect regular schedule.
Supports dry_run: true to estimate cost without executing.
Response includes:
execution.credits- Credits consumedexecution.condition_met- Whether stop condition triggeredexecution.result_changes- For search: see Result Change Tracking below
Result Change Tracking
For search workflows, each execution compares against the immediately previous execution (not all historical executions):
| Field | Description |
|---|---|
net_new_count | URLs in current results that were NOT in the previous execution |
dropped_count | URLs in previous execution that are NOT in current results |
retained_count | URLs present in both executions |
change_rate | Percentage: (new + dropped) / total_unique × 100 |
net_new_urls | Enriched data for new URLs (title, snippet, published_date) |
previous_execution_id | ID of the execution being compared against (null for first execution) |
content_recency | Content recency filtering info (if stale content was filtered) |
Note: A URL can be counted as "new" multiple times if it oscillates in/out of search results. The first execution of a workflow counts all URLs as "new" (no baseline for comparison).
For global uniqueness tracking: Use a Session with your workflow. Sessions maintain URL deduplication via the session_urls table, providing true "never seen before" filtering.
Content Recency Filtering
When stale content is filtered from "net new" results, the response includes a content_recency object:
| Field | Description |
|---|---|
recency_window_days | Number of days used as the recency window |
recency_window_source | How window was calculated: interval (3x configured) or execution_gap (1.5x actual gap) |
confidence_threshold | Minimum confidence required to filter (0-1). Configurable via recency_confidence_threshold. |
urls_filtered_as_stale | Number of URLs filtered as stale |
filtered_content[] | Details of filtered URLs: url, detected_date, confidence, reason |
Confidence Threshold Guide:
- 0.90+ (Permissive): Only filter with explicit dates or very clear signals
- 0.70-0.85 (Balanced): Filter when date markers or URL patterns indicate old content
- 0.50 (Default): Filter when we have any reasonable signal of old content
- 0.40 or below (Aggressive): Filter even with lower confidence signals
Intent Relevance Filtering
Execution summaries now include intent-based relevance filtering. The LLM summarizer filters results that don't match your workflow's monitoring intent, preventing irrelevant content from polluting notifications.
How Intent is Extracted (priority order):
intentfield (AI-planned workflows) - Most explicitdescriptionfield - User-provided contextoperation_config.query(simple workflows) - Implicit from search querynamefield - Last resort fallback (filtering disabled)
When the summarizer has a clear intent, results are classified as:
- NEW - Genuinely new and relevant to monitoring intent
- CONTEXT - Provides background context (not reported as new)
- UPDATE - Updates to previously reported information
- IRRELEVANT - Not related to monitoring intent (filtered)
Response includes (when intent filtering is active):
{
"workflow_execution_summary": {
"summary": "...",
"key_findings": [...],
"intent_relevance_filter": {
"filtered_count": 3,
"filtered_items": [
{"url": "...", "title": "Winter Storm Warning", "reason": "Weather news, not industrial tenant announcements"}
],
"monitoring_intent_used": "Monitor industrial tenant announcements in Dallas"
}
}
}
Notification Suppression: When all changes are filtered as irrelevant (filtered_count > 0 and key_findings is empty), notifications can be suppressed. This prevents "no relevant changes" emails for executions that found new URLs but none matching your intent.
POST /api/v1/workflows/{id}/retry
Retry a failed workflow execution.
POST /api/v1/workflows/{id}/retry-steps
Retry specific failed steps within a workflow execution. Useful for multi-step and AI-planned workflows where only some steps failed.
| Parameter | Type | Required | Description |
|---|---|---|---|
step_ids | String[] | Yes | Step IDs to retry |
execution_id | String | No | Target execution (defaults to latest) |
POST /api/v1/workflows/{id}/share
Toggle public sharing for a workflow. Body: {"public_share": true/false}
GET /api/v1/workflows/{id}/timeline
Get chronological execution history (last 50 executions).
Each execution includes suppression tracking:
notification_suppressed_at- Timestamp when notification was suppressed (null if sent)suppression_reason- Why the notification was suppressedinformation_gain_score- Score (0-100) used for suppression decision
GET /api/v1/workflows/{id}/diff
Get what changed between workflow executions. AI-native diff mode returns changes instead of raw data.
Query Parameters:
limit(Int) - Number of diffs to return (1-50, default: 10)since(String) - Only show diffs after this ISO timestamp
Response includes:
stats-executions_with_changes,change_rate,most_volatile_fieldsanalytics- Field trends, numeric ranges, extraction reliabilitydiffs[]- Per-execution changes withfield,from,to,change_type,change_percentlatest- Most recent state with changes summary
Change Types: increase, decrease, added, removed, text_change, status_change
GET /api/v1/public/workflow/{id}
View a publicly shared workflow (no authentication required).
GET /api/v1/public/workflow/{id}/timeline
View public workflow timeline (no authentication required).
GET /api/v1/workflows/webhook-urls
Get webhook URLs configured for workflows.
Notifications
Notification Intelligence (notification_settings)
Controls smart notification suppression to filter low-value "no new developments" notifications.
| Field | Type | Default | Description |
|---|---|---|---|
suppression_threshold | Number | 30 | Minimum information gain score (0-100) to send notification |
Threshold Presets:
0- All notifications (no suppression)30- Balanced (recommended) - filters obvious "no changes" notifications50- Important only - more aggressive filtering70- Critical only - only send high-value alerts
Example:
{
"notification_settings": { "suppression_threshold": 50 },
"email_config": { "enabled": true, "per_execution": true },
"slack_config": { "enabled": true, "webhook_url": "..." }
}
Email (email_config)
| Field | Type | Description |
|---|---|---|
enabled | Boolean | Enable email notifications |
per_execution | Boolean | Send after each execution |
digest | String | none, daily, weekly |
recipients | Array | Custom emails (max 10) or null for account email |
Slack (slack_config)
| Field | Type | Description |
|---|---|---|
enabled | Boolean | Enable Slack notifications |
webhook_url | String | Slack webhook URL |
channel | String | Override default channel |
per_execution | Boolean | Send after each execution |
event_types | Array | execution.completed, diff.detected, condition.met, execution.failed |
GET /api/v1/workflows/{id}/test-slack
Check Slack configuration status for a workflow.
POST /api/v1/workflows/{id}/test-slack
Send a test Slack notification. FREE
Feedback API (NL Conditions)
Calibrate natural language stop conditions over time.
GET /api/v1/workflows/{id}/feedback
Get calibration status for natural language stop condition.
POST /api/v1/workflows/{id}/feedback
Submit feedback on trigger evaluation.
User Actions: confirmed (true positive), dismissed (false positive), manual_stop (false negative), no_action
DELETE /api/v1/workflows/{id}/feedback
Reset calibration data for a workflow.
Quality Assessments API
Submit answers to quality_questions returned by workflow endpoints. Assessments are stored as training signals and can trigger automatic healing actions (e.g., increasing crawl page budgets, adjusting NL condition calibration). FREE (no credits charged).
POST /api/v1/workflows/{id}/assessments
Submit quality question assessments for a workflow.
| Parameter | Type | Required | Description |
|---|---|---|---|
assessments | Array | Yes | 1-10 assessment items |
assessments[].question_id | String | Yes | The id from a quality_questions entry |
assessments[].answer | String | Yes | One of the question's options values |
assessments[].context | String | No | User intent context (max 500 chars) |
assessments[].execution_id | String | No | Execution ID from quality_questions[].about.execution_id (recommended for exact execution attribution) |
Answer Classification:
| Answer | Signal Type | Description |
|---|---|---|
sufficient, comprehensive_enough, real_event, still_relevant, filter_is_correct, expected_churn | result_thumbs_up | Positive — system is working correctly |
insufficient, too_selective, false_alarm, needs_adjustment, too_aggressive, critical, unstable_results, can_pause | result_thumbs_down | Negative — triggers healing actions |
not_sure, nice_to_have, irrelevant | Skipped | Neutral — no signal stored |
Healing Actions (triggered by negative assessments):
| Answer | Action |
|---|---|
insufficient | Increase crawl max_pages by 2x (capped at 50) |
critical | Flag step for retry on next execution |
needs_adjustment | Log recommendation for query updates |
too_aggressive | Increase recency_confidence_threshold by 0.1 |
too_selective | Store calibration signal for aggregate tuning |
false_alarm | Apply NL stop condition calibration (dismissed) |
can_pause | Pause the workflow |
unstable_results | Log churn investigation recommendation |
Response: Returns assessments_processed, stored, skipped, failed counts, per-item results[] with status, and healing_actions[] with action type and details.
MCP Integration: Assessments can be submitted inline as a side-parameter on zipfai_get_workflow, zipfai_workflow_timeline, zipfai_workflow_diff, and zipfai_workflow_updates — no separate tool call needed. MCP responses include assessment_submission results and quality_loop guidance with recommended_chain.
Execution Feedback API
Thumbs-up/thumbs-down feedback on workflow executions. Signals are stored in the workflow_training_signals table as part of the RL feedback loop. FREE (no credits charged).
POST /api/v1/workflows/{id}/executions/{id}/feedback
Submit feedback for a specific execution.
| Parameter | Type | Required | Description |
|---|---|---|---|
rating | String | Yes | positive or negative |
reason_category | String | Negative: yes | Reason for rating (see taxonomy below) |
comment | String | No | Free-text comment (max 1000 chars). Required when reason_category is other |
result_url | String | No | Specific result URL this feedback targets |
execution_kind | String | No | Auto-detected: search_job, crawl_job, workflow_execution, workflow_step |
workflow_step_id | String | No | Step ID for multi-step/AI-planned workflows |
idempotency_key | String | No | Replay-safe submission key |
actor_model | String | No | Model name for MCP actor attribution |
Reason Categories:
| Rating | Categories |
|---|---|
| Positive | relevant_results, accurate_information, timely_alert, good_formatting |
| Negative | irrelevant_results, missing_information, outdated_content, false_positive, missed_alert, too_slow, other |
Response: Returns status (created, updated, or idempotent_replay) and feedback object with signal details including actor, signal_type, immediate_reward, and created_at.
NL Calibration: Negative feedback with false_positive reason automatically forwards to NL stop condition calibration.
GET /api/v1/workflows/{id}/executions/{id}/feedback
Fetch feedback for a specific execution.
Query Parameters:
workflow_step_id(String) - Filter by step IDmine(Bool) - Only return feedback from the authenticated actorlimit(Int) - Results per page (1-100, default: 50)
DELETE /api/v1/workflows/{id}/executions/{id}/feedback
Retract your feedback for an execution. Only deletes feedback matching the authenticated actor's identity.
Query Parameters: workflow_step_id (String) - Target specific step feedback.
Response: Returns retracted: true and deleted_count.
GET /api/v1/workflows/{id}/execution-feedback
List all feedback for a workflow with cursor pagination and filtering.
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
limit | Int | Results per page (1-100, default: 50) |
cursor | String | Pagination cursor from previous response |
signal_type | String | result_thumbs_up or result_thumbs_down |
actor_type | String | human, api, or mcp |
reason_category | String | Filter by reason category |
execution_id | String | Filter by execution |
workflow_step_id | String | Filter by step |
since | String | ISO timestamp lower bound |
until | String | ISO timestamp upper bound |
mine | Bool | Only return authenticated actor's feedback |
Response includes: feedback[], pagination.limit, pagination.next_cursor
GET /api/v1/workflows/{id}/execution-feedback/stats
Aggregated feedback statistics for a workflow.
Response: Returns total_feedback, thumbs_up_count, thumbs_down_count, positive_rate, feedback_coverage_rate, breakdowns by_reason and by_actor_type, trends (7d/30d), and total_immediate_reward.
GET /api/v1/workflows/{id}/feedback-impact
Show how submitted feedback is shaping workflow behavior and calibration. Requires ownership of the workflow — returns 404 if the workflow does not exist or the requesting customer does not own it.
Response: Returns your_ratings (total, positive, negative, coverage_rate), negative_patterns (top reasons, recommended edits), and community stats.
calibration_impact is null unless the workflow uses a natural_language stop condition with calibration data. When populated, includes nl_condition_adjustments, false_positive_reports, and current/original confidence thresholds.
Errors: 404 if workflow not found or not owned by the requesting customer.
POST /api/v1/workflows/{id}/execution-feedback/batch
Submit feedback for multiple executions in a single request.
| Parameter | Type | Description |
|---|---|---|
feedback | Array | 1-20 feedback items, each with execution_id, rating, and optional fields |
Response: Always HTTP 200 with submitted, succeeded, failed counts and per-item results[] with status.
MCP Tools
Feedback and assessments are available via MCP: zipfai_get_workflow, zipfai_workflow_timeline, zipfai_workflow_diff, zipfai_workflow_updates (all accept inline assessments[]), zipfai_execution_ratings, zipfai_execution_rating_stats, zipfai_feedback_impact. All set X-Zipf-Signal-Source: mcp for actor attribution.
Recrawl API
Importance-based recrawl prioritization. Requires session with Smart Crawl.
GET /api/v1/workflows/{id}/recrawl
Get recrawl configuration and stats.
POST /api/v1/workflows/{id}/recrawl
Enable or update recrawl configuration.
| Parameter | Default | Description |
|---|---|---|
strategy | importance | importance, time, hybrid |
min_interval_hours | 24 | Minimum hours between recrawls |
max_interval_hours | 720 | Maximum hours before recrawl |
importance_multiplier | 2.0 | How much importance affects frequency |
change_detection | true | Track content changes via SHA-256 |
priority_threshold | 0.0 | Only recrawl URLs above this importance |
execute_now | false | Trigger recrawl immediately |
PATCH /api/v1/workflows/{id}/recrawl
Trigger an immediate recrawl.
DELETE /api/v1/workflows/{id}/recrawl
Disable recrawl for this workflow.
Validation API
Pre-flight URL validation with health checks, step reference validation, and URL correction suggestions.
GET /api/v1/workflows/{id}/validate
Get validation status and configuration for a workflow.
Response includes:
validation_config- Current validation settingslast_validation_at- Timestamp of last validationvalidation_status-valid,warnings,invalid,unknowncan_validate- Whether workflow supports validation (multi_step/ai_planned only)
POST /api/v1/workflows/{id}/validate
Run validation checks on workflow URLs and step references.
| Parameter | Default | Description |
|---|---|---|
url_health_check | true | Check URL reachability via HEAD requests |
full_validation | true | Validate step references (depends_on, urls_from_step) |
force | false | Re-validate even if recently validated |
Response includes:
validation.status-valid,warnings,invalidvalidation.urls_checked,urls_healthy,urls_failedvalidation.failed_urls[]- URLs that returned errorsvalidation.redirect_urls[]- URLs with redirects (includesfinal_url)validation.suggestions[]- URL correction suggestionsvalidation.step_reference_issues[]- Invalid step referencesquick_fix_available- Whether auto-corrections are availablequick_fix_url- Endpoint to apply suggestions
URL Corrections Detected:
www1→www(common typo)http→https(protocol upgrade).cpm,.comm→.com(TLD typos)
Recovery API
Smart recovery for failed URLs using search-based replacement discovery.
GET /api/v1/workflows/{id}/recovery
List pending recovery suggestions for a workflow.
Response includes:
pending_suggestions[]- Suggestions awaiting approvalrecent_suggestions[]- Recently applied/rejected suggestionsactions- Available action endpoints
POST /api/v1/workflows/{id}/recovery
Apply or reject recovery suggestions.
| Parameter | Type | Description |
|---|---|---|
suggestion_ids | Array | Specific suggestion IDs to process |
apply_all | Boolean | Apply all pending suggestions |
reject_all | Boolean | Reject all pending suggestions |
reject_reason | String | Reason for rejection |
retry_steps | Boolean | Re-execute affected steps after applying (default: true) |
Response includes:
applied_count,rejected_count,failed_countapplied[],rejected[],failed[]- Suggestion IDs by outcomeretry_steps_triggered- Whether step retry was initiated
POST /api/v1/workflows/{id}/apply-suggestions
Quick-fix endpoint to apply validation suggestions.
| Parameter | Type | Description |
|---|---|---|
suggestion_ids | Array | Specific suggestions to apply (format: step_id:field) |
apply_all | Boolean | Apply all suggestions |
Without parameters: Applies only high-confidence suggestions (>=0.9).
Response includes:
applied_count- Number of suggestions appliedapplied_suggestions[]- Details of applied correctionsworkflow_version- New workflow version after update
MCP Tools
zipfai_workflow_updates (recommended) — Consolidated digest of all workflow updates. Params: since (default 24h), format (json/briefing/briefing_llm/compact), include_inactive, max_workflows, verbose. Signal scoring: 0-100 (urgent 70+, notable 40-69, routine 20-39, noise <20).
Other tools: zipfai_list_workflows, zipfai_get_workflow, zipfai_create_workflow, zipfai_update_workflow, zipfai_execute_workflow, zipfai_workflow_timeline, zipfai_workflow_diff, zipfai_plan_workflow, zipfai_delete_workflow, zipfai_feedback_queue, zipfai_feedback_impact
Standalone Feedback API
Rate any Zipf result — not just workflow executions. Search jobs, crawl jobs, and ask jobs can all receive feedback without a workflow context.
Credits: FREE (no credits charged)
POST /api/v1/feedback
Submit feedback for a standalone search, crawl, or ask job.
| Parameter | Type | Required | Description |
|---|---|---|---|
execution_id | String | Yes | The search_job_id, crawl_id, or ask_id |
rating | String | Yes | positive or negative |
reason_category | String | Negative: yes | Reason for rating (same taxonomy as workflow feedback) |
comment | String | No | Free-text comment (max 1000 chars) |
result_url | String | No | Specific result URL this feedback targets |
Response: Same schema as workflow execution feedback.
Ownership: The execution must belong to the authenticated user. Ownership is verified by checking customer_id in the relevant table (search_jobs, crawls, or ask_jobs).
GET /api/v1/feedback/queue
Get unrated executions ranked by feedback value. Returns items most worth rating.
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
workflow_id | String | - | Filter to a specific workflow |
include_standalone | Bool | true | Include standalone search/crawl/ask jobs |
limit | Int | 10 | Number of items to return (1-50) |
Items are ranked by priority signals (stop condition triggered, has changes, NL condition, low coverage, recency). Each item includes execution_id, score, score_reasons, and a feedback_hint with the MCP tool call template.
Response: Returns items[] ranked by feedback value and total_unrated count.
POST /api/v1/feedback/batch
Submit feedback for multiple standalone executions in a single request.
| Parameter | Type | Description |
|---|---|---|
feedback | Array | 1-20 feedback items, each with execution_id, rating, and optional fields |
Response: Same schema as workflow batch feedback.
GET /api/v1/feedback/email
One-click feedback handler for email and Slack notification links. Verifies an HMAC-SHA256 signature, submits the feedback, and redirects the user to a thank-you page.
Authentication: None (HMAC token in query string replaces Bearer auth).
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
execution_id | String | Yes | The execution to rate |
rating | String | Yes | positive or negative |
token | String | Yes | HMAC-SHA256 signature of execution_id:customer_id |
execution_kind | String | No | workflow_execution (default), search_job, or crawl_job |
Behavior:
- Resolves
customer_idfrom the execution via the relevant table - Verifies the HMAC token (signed with
NEXTAUTH_SECRET) - Submits feedback with
actor.type: "human"andactor.source: "api" - Positive rating redirects to
/feedback?status=thanks - Negative rating redirects to
/feedback?status=reasonwith params for reason selection
Idempotency: Uses execution_id:rating as the idempotency key.
Baseline Adaptations API
View and manage baseline adaptation recommendations generated during the first execution of an AI-planned workflow.
Credits: FREE
GET /api/v1/workflows/{id}/baseline-adaptations
List baseline adaptation recommendations for a workflow.
Query Parameters:
status(String) - Filter by status:pending,applied,rejected,deferred
POST /api/v1/workflows/{id}/baseline-adaptations
Apply or reject baseline adaptation recommendations in batch. Uses optimistic concurrency via expected_version.
| Parameter | Type | Required | Description |
|---|---|---|---|
apply | String[] | Yes | Recommendation IDs to apply (empty [] is valid when only rejecting) |
reject | String[] | Yes | Recommendation IDs to reject (empty [] is valid when only applying) |
expected_version | Number | Yes | Workflow version from GET response (non-negative integer) |
reject_reasons | Object | No | Map of recommendation ID → rejection reason |
Both apply and reject are required keys but may be empty arrays. At least one must contain IDs for the request to have effect. When an empty array is supplied for either field, the corresponding applied_count or rejected_count in the response will be 0.
Concurrency: If expected_version doesn't match, the server logs the mismatch but proceeds. True concurrent row-level conflicts return 409.
Response: Returns applied_count, rejected_count, new_version, workflow_updated, and optionally skipped_count/skipped_ids for already-processed recommendations.