For the complete documentation index, see llms.txt. This page is also available as Markdown.

Ultimate Parent

Resolve the ultimate parent of a company through corporate-hierarchy reasoning. Submit a company (name + website, optional country); the API returns a job_id you poll until the result is ready. The response includes the ultimate corporate parent, the full ownership chain (intermediate holding entities), the ultimate financial parent when it differs from the corporate parent, GLEIF Legal Entity Identifier (LEI) data for every entity, and the LLM's reasoning + cited source URL.

Submit an ultimate-parent resolution job

post

Submit a company (name + website, optional country) for ultimate-parent resolution. Returns a job ID for tracking the process.

Required scopes
This endpoint requires the following scopes:
  • : Access to the public API
Authorizations
OAuth2clientCredentialsRequired

OAuth2 client credentials flow for API access

Token URL:
Body

Payload to submit a new ultimate-parent resolution job.

company_namestring · min: 1Required

The company whose ultimate parent we want to resolve. Free-form name as it appears commercially or legally.

Example: LVMH
websitestring · min: 1Required

The company's primary website. Used by the LLM to ground the search and resolve ambiguity. URL scheme will be added automatically if missing.

Example: https://www.lvmh.com/
countrystring · nullableOptional

Optional country to disambiguate when the website's jurisdiction is unclear (e.g., generic .com domains). Free-form name; not constrained to ISO codes.

Example: France
Responses
202

Job submitted to get-ultimate-queue

application/json

Response after submitting an ultimate-parent resolution job.

job_idstring · nullableOptional

The job ID. Required if status_code <= 300.

Example: 4e8a7b3c-1234-5678-90ab-cdef12345678
messagestringRequired

The message to return

Example: Job submitted to get-ultimate-queue
statusstring · enumRequired

The status of the process

Example: SUCCESSPossible values:
status_codeintegerRequired

The HTTP status code to return

Example: 202
post/v1/ultimate
POST /v1/ultimate HTTP/1.1
Host: api.delpha.io
Authorization: Bearer YOUR_OAUTH2_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 76

{
  "company_name": "LVMH",
  "website": "https://www.lvmh.com/",
  "country": "France"
}
{
  "job_id": "4e8a7b3c-1234-5678-90ab-cdef12345678",
  "message": "Job submitted to get-ultimate-queue",
  "status": "SUCCESS",
  "status_code": 202
}

Get ultimate-parent job status

get

Retrieve the result and status of a previously submitted ultimate-parent resolution job.

Required scopes
This endpoint requires the following scopes:
  • : Access to the public API
Authorizations
OAuth2clientCredentialsRequired

OAuth2 client credentials flow for API access

Token URL:
Path parameters
job_idstringRequired

The unique identifier of the ultimate-parent job

Example: {"summary":"Sample job ID","value":"4e8a7b3c-1234-5678-90ab-cdef12345678"}
Responses
200

Job succeeded.

application/json

Response after retrieving the status and result of an ultimate-parent job.

job_idstringRequired

The job ID echoed back from the request.

Example: 4e8a7b3c-1234-5678-90ab-cdef12345678
messagestring · nullableOptional

A human-readable message describing the current state or outcome of the job.

Example: Job succeeded.
statusstring · enumRequired

The status of the process. Note: SUCCESS at status_code=202 means 'still running'.

Example: SUCCESSPossible values:
status_codeintegerRequired

The HTTP status code representing the job's current state. 404 means the job id was never issued.

Example: 200
get/v1/ultimate/{job_id}
GET /v1/ultimate/{job_id} HTTP/1.1
Host: api.delpha.io
Authorization: Bearer YOUR_OAUTH2_TOKEN
Accept: */*
{
  "job_id": "4e8a7b3c-1234-5678-90ab-cdef12345678",
  "message": "Job succeeded.",
  "status": "SUCCESS",
  "status_code": 200,
  "result": {
    "confidence": 0.95,
    "comment": "Per LVMH 2024 annual report, Christian Dior SE holds 41.4% ...",
    "source_url": "https://www.lvmh.com/group/governance/",
    "subsidiary_commercial_name": "Sephora Italy",
    "ultimate_parent_source_level": "Securities Filing",
    "evidence_summary": "Identity: Sephora SAS verified | Chain: Sephora SAS -> LVMH ... | Protocol: 6 | Discard Check: ... | GTM Selection: LVMH selected as the active Operating Conglomerate"
  }
}

Submit a batch of ultimate-parent resolution items

post

Submit 1..100 ultimate-parent resolution items for asynchronous batch processing as ONE job (never a per-item fan-out). Returns a job_id immediately (202); poll GET /v1/ultimate/batch/{job_id} for status and results. Each item is validated identically to the single-route POST /v1/ultimate payload; a payload with 0 items or more than 100 is rejected with 422.

Required scopes
This endpoint requires the following scopes:
  • : Access to the public API
Authorizations
OAuth2clientCredentialsRequired

OAuth2 client credentials flow for API access

Token URL:
Body

Batch envelope for POST /v1/ultimate/batch: {"items": [...]} (1..100 items, 422 beyond); each item is shaped exactly like the single-route POST /v1/ultimate payload (reused here by $ref as UltimateSubmitInput).

Responses
202

Batch submitted

application/json

Response after submitting a batch quality job.

job_idstring · nullableOptional

The job ID. Required if status <= 300.

Example: 21014abc65004d2781d2e0ef4c9fbb46
item_countinteger · nullableOptional

Number of items accepted in the batch (present on success).

Example: 100
messagestringRequired

The message to return

Example: Batch submitted
statusstring · enumRequired

The status of the process

Example: SUCCESSPossible values:
status_codeintegerRequired

The status code to return

Example: 202
post/v1/ultimate/batch
POST /v1/ultimate/batch HTTP/1.1
Host: api.delpha.io
Authorization: Bearer YOUR_OAUTH2_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 88

{
  "items": [
    {
      "company_name": "LVMH",
      "website": "https://www.lvmh.com/",
      "country": "France"
    }
  ]
}
{
  "job_id": "21014abc65004d2781d2e0ef4c9fbb46",
  "item_count": 100,
  "message": "Batch submitted",
  "status": "SUCCESS",
  "status_code": 202
}

Get ultimate-parent resolution batch job status

get

Poll a batch of ultimate-parent resolution items submitted via POST /v1/ultimate/batch. 202 while running (with item_count/processed_count progress); 200 once SUCCEEDED (with counts, a presigned result_url, and result_data inlined when <=1MB); 409 if the credit reservation expired before delivery (resubmit); 500 if the job failed; 504 past the 24h ceiling (batch jobs run on Batch/Vertex timescales, hours not minutes).

Required scopes
This endpoint requires the following scopes:
  • : Access to the public API
Authorizations
OAuth2clientCredentialsRequired

OAuth2 client credentials flow for API access

Token URL:
Path parameters
job_idstringRequired

The unique identifier of the ultimate-parent resolution batch job.

Example: {"summary":"Sample job ID","value":"21014abc65004d2781d2e0ef4c9fbb46"}
Responses
200

97/100 items succeeded

application/json

Response for GET /v1/ultimate/batch/{job_id}. Each result_data.items[] entry is keyed to its request item by dispatch_key ({"record_id": "<job_id>#<index>"}). On success its result is the SAME object GET /v1/ultimate/{job_id} returns for a single item (see UltimateResult), EXCEPT relationship_type here is a nullable string rather than the strict enum — the batch compiler passes the LLM's raw label straight through, so an off-vocabulary value surfaces as that string instead of null. On failure it carries an error string instead of result.

messagestringRequired

A human-readable message describing the current state or outcome of the job.

Example: 97/100 items succeeded
statusstring · enumRequired

The status of the process

Example: SUCCESSPossible values:
status_codeintegerRequired

The HTTP status code representing the job's current state.

Example: 200
result_urlstring · nullableOptional

Presigned URL (1h expiry) to download the full batch result JSON from S3.

Example: https://delpha-api-batch-dev.s3.amazonaws.com/batch-results/<job_id>.json?...
item_countinteger · nullableOptional

Total number of items in the batch (present while the job is running).

processed_countinteger · nullableOptional

Number of items processed so far (present while the job is running; may be absent early in the job's lifecycle).

process_timenumber · nullableOptional

The total time taken to process the job, in seconds.

Example: 12.3
get/v1/ultimate/batch/{job_id}
GET /v1/ultimate/batch/{job_id} HTTP/1.1
Host: api.delpha.io
Authorization: Bearer YOUR_OAUTH2_TOKEN
Accept: */*
{
  "message": "97/100 items succeeded",
  "status": "SUCCESS",
  "status_code": 200,
  "counts": {
    "total": 100,
    "succeeded": 97,
    "failed": 3
  },
  "result_url": "https://delpha-api-batch-dev.s3.amazonaws.com/batch-results/<job_id>.json?...",
  "result_data": {
    "job_id": "21014abc65004d2781d2e0ef4c9fbb46",
    "usecase": "ultimate",
    "counts": {
      "total": 2,
      "succeeded": 1,
      "failed": 1
    },
    "items": [
      {
        "dispatch_key": {
          "record_id": "21014abc65004d2781d2e0ef4c9fbb46#0"
        },
        "result": {
          "confidence": 0.95,
          "comment": "Per LVMH 2024 annual report, Christian Dior SE holds 41.4% ...",
          "source_url": "https://www.lvmh.com/group/governance/",
          "subsidiary_commercial_name": "Sephora Italy",
          "ultimate_parent_source_level": "Securities Filing",
          "evidence_summary": "Identity: Sephora SAS verified | Chain: Sephora SAS -> LVMH ... | Protocol: 6 | Discard Check: ... | GTM Selection: LVMH selected as the active Operating Conglomerate",
          "ultimate_parent": {
            "legal_name": "LVMH MOET HENNESSY LOUIS VUITTON SE",
            "commercial_name": "LVMH",
            "country": "France",
            "website": "https://www.lvmh.com/",
            "entity_type": "Corporation",
            "ownership_status": "Unknown",
            "comment": "Target operating entity"
          },
          "relationship_type": "Wholly Owned",
          "ownership_chain": [],
          "ultimate_financial_parent": null,
          "is_self_ultimate": false
        }
      },
      {
        "dispatch_key": {
          "record_id": "21014abc65004d2781d2e0ef4c9fbb46#1"
        },
        "error": "Processing failed for this item."
      }
    ]
  },
  "item_count": null,
  "processed_count": null,
  "process_time": 12.3
}

Last updated

Was this helpful?