Skip to content

Enrichment Order Guide

Use an enrichment order when you already know the companies you want OpenProspect to enrich.

Submitted companies are treated as the prequalified candidate population. OpenProspect evaluates that population against the search profile's delivery policy before publication, so the final available count can be lower than the submitted count. For example, 498 submitted companies can produce 413 published results when 85 do not meet the configured contactability or quality requirements.

Request Model

POST /api/v1/orders

Field Required Description
order_type Yes Must be ENRICHMENT
title Yes Your label for the order
profile_id Yes Search profile returned by profile creation
companies Yes Schema limit: between 1 and 10,000 JSON company objects
features Yes Briefing features to deliver
output_language No Defaults to en
briefing_quantity No Forbidden; derived from companies.length

Do not send profile_name, ideal_customer_profile, or other profile fields to POST /api/v1/orders.

The item limit is independent of the HTTP request-body limit. Deployments accept at most 10 MB by default (10,485,760 bytes), so a field-heavy request can reach the byte limit before 10,000 companies. Serialize the JSON before submission and split it into smaller orders if it approaches 10 MB. An oversized request returns 413 with a detail message.

Create Request

curl -sS -X POST "https://api.openprospect.io/api/v1/orders" \
  -H "Authorization: Bearer ${OPENPROSPECT_API_KEY}" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: enrichment-order-dach-saas-001" \
  -d '{
    "order_type": "ENRICHMENT",
    "title": "DACH SaaS enrichment",
    "profile_id": "'"${OPENPROSPECT_PROFILE_ID}"'",
    "features": ["COMPANY_DATA", "CONTACTS", "TECHNOLOGIES"],
    "companies": [
      {
        "company_name": "Grand Hotel Berlin",
        "external_id": "crm-1001",
        "website_url": "https://www.grandhotel-berlin.de",
        "city": "Berlin",
        "country": "Germany"
      },
      {
        "company_name": "Alpine Resort Innsbruck",
        "external_id": "crm-1002",
        "city": "Innsbruck",
        "country": "Austria"
      }
    ]
  }'

Expected 202 Accepted response:

{
  "order_id": "4f767705-03a2-4e91-a3e8-1ec3f9dea865",
  "order_type": "ENRICHMENT",
  "status": "RECEIVED",
  "briefing_quantity": 2,
  "message": "Order received. Awaiting admin review."
}

Company Fields

Field Required Description
company_name Yes Company name
external_id No Your CRM/source ID; returned as source_id
website_url No Company website
postal_code No Postal or ZIP code
city No City
street No Street address
country No Country
email No Contact email
phone No Contact phone
employee_count No Number of employees
industry_code No SIC or industry code
industry_description No Industry description

Provide website_url when you have it. It improves matching and enrichment quality.

Prepare Company Data from CSV

The order endpoint accepts JSON. It does not accept CSV uploads. Convert each CSV row to one object in companies before submitting the order.

For example, map a source file with these common columns:

Source CSV column Request field
external_id external_id
firm_name company_name
website website_url
city city
plz postal_code

One mapped row has this shape:

{
  "external_id": "crm-1001",
  "company_name": "Example Manufacturing GmbH",
  "website_url": "https://example-manufacturing.de",
  "city": "Berlin",
  "postal_code": "10115"
}

Use a stable, unique external_id when you need to match enriched results back to your CRM. OpenProspect returns that value as the company-level source_id.

Idempotent Retries

Generate one Idempotency-Key for each logical order. If a network failure leaves the response uncertain, retry the identical body with the same key. Use a new key whenever you change the request body. Reusing a key with a different body returns 409.

Lifecycle

External clients submit an order, poll its status, and retrieve completed results. OpenProspect performs review and managed fulfillment internally. A requested feature describes the expected result; it is not a client-invoked processing step.

Status Class Meaning Client action
RECEIVED Active The API accepted the order for review; enrichment is not complete Poll again
ACCEPTED Active OpenProspect approved the order for managed fulfillment Poll again
IN_PROGRESS Active OpenProspect is producing the requested results Poll again
COMPLETED Successful terminal Managed fulfillment ended Retrieve pages only when results_published is true; otherwise contact support
REJECTED Unsuccessful terminal The order was not approved Stop polling and contact support with the order ID
FAILED Unsuccessful terminal Fulfillment failed Stop polling and contact support with the order ID
CANCELLED Unsuccessful terminal The order was cancelled Stop polling

Results

Call GET /api/v1/orders/{order_id}/results only after the order is COMPLETED and results_published is true. The result resource is an immutable order snapshot; later profile changes do not rewrite it.

Every submitted row comes back as one item, in submitted order. Each item echoes your external_id, carries a status with reason_codes, and holds the enriched company (with embedded prospects) or null when the identity could not be resolved. The company-level source_id also matches the submitted external_id.

status Meaning
ENRICHED Resolved and policy-eligible; contacts selected by the profile policy
PARTIAL Resolved, but the profile policy annotated the row (see reason_codes); company facts only
UNRESOLVED No company matched the submitted identity; company is null
DUPLICATE Resolved to the same company as duplicate_of_input_position
BLOCKED Held for operator review
Query parameter Type Required Description
limit integer No Slots per page, from 1 to 100; default 50
offset integer No Number of slots to skip; default 0

Continue requesting pages while has_more is true. Increase offset by the number of items returned on the current page. A 199-company order takes two requests at limit=100; a single request without pagination returns only the first 50 companies by default.

Each delivered prospect can include:

Field Meaning
email_status Validation status, such as VERIFIED or UNVERIFIED
email_type Email category: PERSONAL, GENERAL, or UNKNOWN
email_delivery_quality Authoritative risk tier, such as client_deliverable or risky_internal_catchall
email_delivery_quality_reason Reason behind the email_delivery_quality decision
email_client_deliverable OpenProspect's default-campaign safety decision

If your integration accepts only verified emails, keep prospects whose email_status == "VERIFIED". If you want OpenProspect's stricter default-campaign policy, also require email_client_deliverable == true. The boolean is a policy decision, not an alias for email_status.

If results are not ready, the API returns ORDER_RESULTS_NOT_READY; continue polling only while the order is active. If a historical order is COMPLETED but results_published is false, contact support with the order ID.

Do not reconcile the order through GET /api/v1/deliveries/{prospect_search_id}/companies. That endpoint is legacy profile-wide CRM sync / drip and can include companies from other orders. The order-scoped result pages (GET /api/v1/orders/{order_id}/results) are the authoritative population for this order.

See the Enrichment Quick Start for lossless examples in all supported languages.

Errors

Status Cause Resolution
409 Reused Idempotency-Key with a different order body Use a new key
422 Missing companies, missing profile_id, or sent briefing_quantity Correct the body
404 profile_id or order_id is not visible to your organization Verify the ID and API key
404 ORDER_RESULTS_NOT_READY before COMPLETED Poll order status

See Error Handling for authentication, authorization, validation, retry, and terminal-status recovery.