Skip to main content
GET
/
v1
/
entity-resolution
/
{job_id}
Get entity resolution result
curl --request GET \
  --url https://api.kernel.ai/rest/v1/entity-resolution/{job_id} \
  --header 'x-api-key: <api-key>'
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "completed",
  "created_at": "2025-06-05T12:00:00Z",
  "completed_at": "2025-06-05T12:00:05Z",
  "record": {
    "kernel_id": "6347422643",
    "entity_type": "legal_entity",
    "entity_resolution_confidence": "HIGH",
    "entity_resolution_reasoning": "Company identified as Stripe, Inc. via legal name, website, and country alignment.",
    "legal_info": {
      "country": "US",
      "reasoning": "Confirmed via Stripe terms of service page.",
      "brand_name": "Stripe, Inc.",
      "confidence": "HIGH",
      "legal_name": "Stripe, Inc.",
      "website": "https://stripe.com"
    },
    "brand_info": {
      "country": "US",
      "website": "https://stripe.com",
      "reasoning": "Primary brand site confirmed via domain ownership.",
      "brand_name": "Stripe",
      "confidence": "HIGH"
    },
    "entity_classification": {
      "type": "Company",
      "subtype": "Operating",
      "reasoning": "Classified as an operating company based on commercial activity."
    }
  }
}
Poll this endpoint with the jobId returned by Resolve entity to check the status and retrieve the result.

Status lifecycle

Jobs progress linearly to a terminal state:
pending → processing → completed | failed
Once a job reaches completed or failed, the status does not change.

Result structure

When status is completed, the record field contains the resolved identity with confidence levels and structured legal and brand information. For pending or processing jobs, record is null. For failed jobs, record is also null.

Example

curl
curl https://api.kernel.ai/rest/v1/entity-resolution/550e8400-e29b-41d4-a716-446655440000 \
  -H "x-api-key: $KERNEL_API_KEY"
Response (200) — completed
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "completed",
  "created_at": "2025-06-05T12:00:00Z",
  "completed_at": "2025-06-05T12:00:05Z",
  "record": {
    "kernel_id": "6347422643",
    "entity_type": "legal_entity",
    "entity_resolution_confidence": "HIGH",
    "entity_resolution_reasoning": "Company identified as Stripe, Inc. via legal name, website, and country alignment. Official Stripe entity confirmed via terms page.",
    "legal_info": {
      "country": "US",
      "reasoning": "Confirmed via Stripe terms of service page.",
      "brand_name": "Stripe, Inc.",
      "confidence": "HIGH",
      "legal_name": "Stripe, Inc.",
      "website": "https://stripe.com"
    },
    "brand_info": {
      "country": "US",
      "website": "https://stripe.com",
      "reasoning": "Primary brand site confirmed via domain ownership.",
      "brand_name": "Stripe",
      "confidence": "HIGH"
    },
    "entity_classification": {
      "type": "Company",
      "subtype": "Operating",
      "reasoning": "Classified as an operating company based on commercial activity."
    }
  }
}
Response (200) — still processing
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "processing",
  "created_at": "2025-06-05T12:00:00Z"
}
Response (200) — failed
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "failed",
  "created_at": "2025-06-05T12:00:00Z",
  "completed_at": "2025-06-05T12:00:05Z"
}

Polling guidance

  • Use exponential backoff between polls (start at 2 seconds, cap at 30 seconds).
  • Jobs that do not exist yet (or whose ID is unknown) return { "status": "pending" }.

Polling example

TypeScript
const API_KEY = "your_api_key";
const BASE_URL = "https://api.kernel.ai/rest";
const headers = { "x-api-key": API_KEY, "Content-Type": "application/json" };

async function resolveEntity(input: Record<string, string>): Promise<string> {
  const res = await fetch(`${BASE_URL}/v1/entity-resolution`, {
    method: "POST",
    headers,
    body: JSON.stringify(input),
  });
  if (!res.ok) throw new Error(`POST failed: ${res.status}`);
  const data = await res.json();
  return data.jobId;
}

async function pollResult(jobId: string, timeoutMs = 120_000): Promise<Record<string, unknown>> {
  const start = Date.now();
  let interval = 2000;
  while (Date.now() - start < timeoutMs) {
    const res = await fetch(`${BASE_URL}/v1/entity-resolution/${jobId}`, { headers });
    if (!res.ok) throw new Error(`GET failed: ${res.status}`);
    const data: Record<string, unknown> = await res.json();
    if (data.status === "completed") return data.record as Record<string, unknown>;
    if (data.status === "failed") throw new Error("Job failed — retry with more identifying fields");
    await new Promise((r) => setTimeout(r, interval));
    interval = Math.min(interval * 2, 30_000);
  }
  throw new Error(`Job ${jobId} did not complete within ${timeoutMs / 1000}s`);
}

const jobId = await resolveEntity({ legal_name: "Stripe, Inc.", website: "https://stripe.com", country: "US" });
const result = await pollResult(jobId);
console.log(result.entity_type); // "legal_entity"
For the full IdentityResult schema, see Completed result.

Authorizations

x-api-key
string
header
required

Include your API key in the x-api-key header.

Path Parameters

job_id
string
required

Job ID returned by the POST endpoint

Example:

"550e8400-e29b-41d4-a716-446655440000"

Response

Job status response