Polling for Results

Retrieve execution status and extracted data

After triggering a workflow execution, poll the execution endpoint to check its status and retrieve results once processing is complete.

Endpoint

GET /api/v1/workflow-builder/workflows/{workflow_id}/executions/{execution_id}
ParameterLocationDescription
workflow_idPathThe workflow ID
execution_idPathThe execution ID returned when you created the execution

Execution Statuses

StatusDescriptionAction
runningThe execution is still processingContinue polling
completedAll steps finished successfullyParse the results
failedThe execution encountered an errorCheck the error details

Response Structure

While Running

1{
2 "workflow_id": "d5929cd9-1d50-49ea-afb4-b5ce43c1296a",
3 "workflow_execution_id": "e1f2a3b4-c5d6-7890-abcd-ef1234567890",
4 "status": "running",
5 "metadata": {"external_id": "INV-2024-001"}
6}

On Completion

When the execution completes, the response includes a steps array with the extracted data. Each step corresponds to a processing stage in your workflow.

If you see table-style outputs in the Further AI dashboard, the API returns the same data as structured rows and columns. Each cell includes a value and a confidence_score (a number from 0.0 to 1.0 indicating extraction confidence).

1{
2 "workflow_id": "d5929cd9-1d50-49ea-afb4-b5ce43c1296a",
3 "workflow_execution_id": "e1f2a3b4-c5d6-7890-abcd-ef1234567890",
4 "status": "completed",
5 "metadata": {"external_id": "INV-2024-001"},
6 "steps": [
7 {
8 "step_name": "Extract Policy Details",
9 "data": {
10 "schema": { ... },
11 "data": [
12 {
13 "policy_number": {
14 "value": "POL-AUTO-78901",
15 "confidence_score": 0.97
16 },
17 "insured_name": {
18 "value": "Jane Smith",
19 "confidence_score": 0.95
20 },
21 "effective_date": {
22 "value": "2024-01-01",
23 "confidence_score": 0.92
24 }
25 }
26 ],
27 "metadata": {}
28 }
29 }
30 ]
31}
FieldDescription
stepsArray of step results. Only present when status is completed.
steps[].step_nameName of the workflow step
steps[].data.schemaSchema definition describing the fields
steps[].data.dataArray of extracted rows. Each cell contains value and confidence_score.
steps[].data.metadataAdditional metadata about the extraction

The API only returns value and confidence_score per cell. What you see in the response is the same structured data visible in the Further AI dashboard.

On Failure

1{
2 "workflow_id": "d5929cd9-1d50-49ea-afb4-b5ce43c1296a",
3 "workflow_execution_id": "e1f2a3b4-c5d6-7890-abcd-ef1234567890",
4 "status": "failed",
5 "metadata": {"external_id": "INV-2024-001"}
6}

Polling Strategy

Start with a 5-second interval and use exponential backoff for long-running workflows. Most workflows complete within 1-3 minutes. The timeout in the example below is a suggestion — there is no hard system limit on execution time.

1import time
2import requests
3
4def poll_execution(
5 workflow_id: str,
6 execution_id: str,
7 access_token: str,
8 initial_interval: int = 5,
9 max_interval: int = 30,
10 max_wait: int = 600
11) -> dict:
12 """
13 Poll a workflow execution until it completes or fails.
14
15 Uses exponential backoff starting at initial_interval seconds,
16 capping at max_interval seconds.
17 """
18 base_url = "https://api.further.ai"
19 url = f"{base_url}/api/v1/workflow-builder/workflows/{workflow_id}/executions/{execution_id}"
20 headers = {"Authorization": f"Bearer {access_token}"}
21
22 elapsed = 0
23 interval = initial_interval
24
25 while elapsed < max_wait:
26 response = requests.get(url, headers=headers)
27 response.raise_for_status()
28 result = response.json()
29
30 status = result["status"]
31 print(f"[{elapsed}s] Status: {status}")
32
33 if status == "completed":
34 return result
35 if status == "failed":
36 return result
37
38 time.sleep(interval)
39 elapsed += interval
40 interval = min(interval * 1.5, max_interval)
41
42 raise TimeoutError(f"Execution did not complete within {max_wait} seconds")
43
44
45# Usage
46result = poll_execution(
47 workflow_id="YOUR_WORKFLOW_ID",
48 execution_id="YOUR_EXECUTION_ID",
49 access_token=access_token
50)
51
52if result["status"] == "completed":
53 for step in result["steps"]:
54 print(f"{step['step_name']}: {step['data']}")
ScenarioRecommended Interval
Simple extraction (1-2 pages)3-5 seconds
Standard workflow (5-20 pages)5-10 seconds
Complex workflow (many steps)10-15 seconds with backoff
Bulk processing15-30 seconds with backoff

Alternative: Webhooks

If you prefer push-based notification instead of polling, see Webhooks to get notified when an execution completes.