API Changelog¶
The public API contract is versioned independently of the platform release.
The current contract version appears as info.version in
the OpenAPI document.
1.3.0 (unreleased)¶
Order results are now one item per submitted slot, and an enrichment order returns every row you submitted — in the order you submitted it — whether or not the identity resolved or passed the profile's quality policy. Every row that was not fully enriched now says why.
Added¶
reasonson every result slot. Each reason carries a stablecode, an Englishmessage, and adetailwhen there is a fact behind it. New codes name the pipeline stage that stopped:WEBSITE_UNREACHABLE(detail: the URL tried),WEBSITE_MOVED(detail: the origin it redirects to),WEBSITE_BLOCKED,WEBSITE_EMPTY,NO_PEOPLE_FOUND,NO_EMAIL_FOUND, andNOT_PROCESSED.reason_codesis unchanged and lists the same codes.summaryon every results page andresult_summaryon the order status onceresults_publishedistrue:requested_count,fully_enriched_count,annotated_count, and the annotated rows counted per reason with their English message.result_summaryisnullbefore publication.- CSV and XLSX outputs render the
Result Reasonscolumn as the English message with the detail in parentheses.
Breaking changes¶
GET /api/v1/orders/{order_id}/resultsitems are slot envelopes, not bare company objects. Each item carriesinput_position,external_id(the value you submitted),status,reason_codes, an optionalduplicate_of_input_position, andcompany— the enriched company with embedded prospects, ornullwhen the identity never resolved. Readitem.companywhere you previously read the item itself.- Enrichment orders return every submitted row.
totalandavailable_briefing_quantityequal the submitted count. Rows that did not meet the profile's quality policy are returned withstatus: "PARTIAL"and a reason code instead of being omitted; unresolved rows are returned withstatus: "UNRESOLVED"andcompany: null. Filter onstatusif you only want policy-eligible companies. Discovery orders are unchanged: they return the companies the order found, each withstatus: "ENRICHED". - CSV, XLSX, and Google Sheets outputs of an enrichment order contain the same
rows as the results API, with
Result StatusandResult Reasonscolumns.
Slot statuses: ENRICHED (resolved and policy-eligible), PARTIAL (resolved,
policy annotated the row; no contacts selected), UNRESOLVED (identity could
not be matched to a company), DUPLICATE (resolved to the same company as an
earlier row, see duplicate_of_input_position), BLOCKED (held for operator
review).
GET /api/v1/deliveries/{prospect_search_id}/companies remains available as
legacy profile-wide CRM sync / drip. It is not an order door; reconcile orders
through GET /api/v1/orders/{order_id}/results only.
1.2.0¶
API keys can no longer read live pipeline company and prospect lists. The remaining external company and prospect contract is delivered CRM sync plus website markdown.
Breaking changes¶
- Live pipeline company and prospect routes are no longer part of the
public API-key contract. Valid keys receive
403withAPI_KEY_ROUTE_FORBIDDEN. First-party JWT (the Pipeline view) is unchanged. UseGET /api/v1/deliveries/{prospect_search_id}/companiesfor delivered companies and prospects, andGET /api/v1/deliveries/{prospect_search_id}/companies/{company_id}/website-markdownfor optimized website markdown of a delivered company. - New API keys may only be issued remaining public-route scopes:
orders:read,orders:write,companies:read,prospects:read,delivery:read,prospect_searches:read,blacklists:read, andblacklists:write. Existing stored keys are not rewritten; unused scopes on those keys no longer unlock a public route.
1.1.0¶
Orders became atomic and API-first: an order is COMPLETED only when its
immutable result set is published, and GET /api/v1/orders/{order_id}/results
is the primary delivery channel.
Breaking changes¶
- Delivered-company prospect lists now contain only the delivered contacts.
GET /api/v1/deliveries/{prospect_search_id}/companiesandGET /api/v1/orders/{order_id}/resultsre-apply the search profile's delivery quality policy on read (qualification floor and per-company cap — the same selection that produced the delivery). Previously every prospect row linked to a delivered company was returned, including unqualified and unvalidated contacts that were never part of the delivery. validation_confidenceandbounce_risk_scorewere removed from delivered prospect responses. Both were derived fromemail_statusand carried no independent signal, so ranking bounce risk by them was misleading. Useemail_delivery_qualityandemail_client_deliverableinstead.estimated_costwas removed from the order create and order status responses. Pricing is agreed individually per client and is never derived from an automated estimate. Regenerate clients from the current OpenAPI document; previously generated clients that require this field will fail to parse order responses until regenerated.delivered_sincewas removed fromGET /orders/{order_id}/results. Results are now published once as one immutable set, so incremental delivery-time filtering no longer applies. Retrieve the full paginated set; each result item carries its owndelivered_at.admin_notesandwebhook_urlwere removed from the customer order status response. Rejection follow-up goes through support; the webhook URL remains a write-only order-creation field for status notifications.organization_idwas removed from order list items. The authenticated API key already fixes the organization context.
Added¶
email_delivery_qualityandemail_delivery_quality_reasonon delivered prospects: the authoritative email risk tier the delivery pipeline itself applies (for exampleclient_deliverable,generic_company_tier,risky_internal_catchall), matching the columns CSV exports already ship.GET /api/v1/deliveries/{prospect_search_id}/companies/{company_id}/website-markdown: verified website crawl ground truth for a delivered company — the aggregate optimized markdown that OpenProspect's own extraction and analysis consume, with crawl provenance (observed_at, URLs, content fingerprint).results_publishedon order status and list responses: the readiness signal for result retrieval. A published zero-result order is valid.- Immutable order results: repeated retrieval always returns identical content, unaffected by later data changes.
- Optional outputs (
POST /api/v1/orders/{order_id}/outputs) projecting the published result set to CSV, XLSX, or Google Sheets, with durable receipts, idempotent replay, and thecreatedflag distinguishing replays.
Changed¶
available_briefing_quantitynow counts the immutable published result set rather than live delivery tracking rows.- Error responses for order results and exports now declare their complete
status sets, including
409and500invariant refusals. See Error Handling.
1.0.0¶
Initial public contract: orders, order results, profile companies, prospect searches, blacklists, and exports.