Timeline: V1 is now the default for the FindAll API. Requests no longer need the parallel-beta: "findall-2025-09-15" header — requests without it use V1. The header is still accepted for backwards compatibility but no longer changes behavior. Existing V0 runs remain retrievable by their original run IDs.
Match conditions return both value and is_matched boolean
Increased match_limit from 200 to 1,000
Better Performance: Improved latency and match quality across all stages
Breaking Changes: V1 is not backward compatible. V0 runs cannot be accessed via V1 endpoints. Parameter names, response schemas, and pricing have changed.
This example shows the complete workflow migration, including enrichments:
import requestsimport timeAPI_KEY = "your_api_key"BASE_URL = "https://api.parallel.ai"# Step 1: Ingest queryingest_response = requests.post( f"{BASE_URL}/v1beta/findall/ingest", headers={"x-api-key": API_KEY}, json={"query": "Find AI companies that raised Series A in 2024 and get CEO names"})findall_spec = ingest_response.json()# Step 2: Create run (constraints + enrichments together)run_response = requests.post( f"{BASE_URL}/v1beta/findall/runs", headers={"x-api-key": API_KEY}, json={ "findall_spec": findall_spec, "processor": "core", "result_limit": 100 })findall_id = run_response.json()["findall_id"]# Step 3: Poll until both flags are falsewhile True: poll_response = requests.get( f"{BASE_URL}/v1beta/findall/runs/{findall_id}", headers={"x-api-key": API_KEY} ) result = poll_response.json() if not result["is_active"] and not result["are_enrichments_active"]: break time.sleep(15)# Step 4: Access results from poll responsefor entity in result["results"]: print(f"{entity['name']}: Score {entity['score']}") # Loop through arrays to find values for filter_result in entity["filter_results"]: print(f" {filter_result['key']}: {filter_result['value']}") for enrichment in entity["enrichment_results"]: print(f" {enrichment['key']}: {enrichment['value']}")