- Brand
- Delpha
- Category
- Data & Analytics
- Primary Subcategory
- Data Validation & Normalization Utilities
Integration details
Description
Delpha helps AI agents verify commercial identity: which company a record refers to, the commercial group it belongs to, and its business contact details. Results include validation findings, confidence scores and supporting evidence where available, helping teams assess records before taking action. Delpha uses a company's website alongside other identity signals to distinguish companies with similar names and assess their commercial relationships. What you can do with Delpha: • Resolve a company's commercial parent and distinguish it from its legal or financial parent • Validate a company's website, LinkedIn page and legal identifier • Find and verify a person's LinkedIn profile and business email • Validate and normalize a phone number or name you already hold • Assess new-logo and account-routing decisions when existing CRM account information is provided Built for RevOps, sales and data teams. The tools look up, validate and normalize data; they do not modify your CRM. Applying changes requires a separate CRM integration. Results can be incomplete or uncertain and should be assessed using the returned evidence and confidence information. Requires a Delpha account with MCP access enabled at delpha.ai. People data: Delpha holds no contact database. Email candidates come from name and company-domain patterns, LinkedIn profiles from public web search, and phone checks from verification providers. Data sources and privacy details: https://help.delpha.io/delpha-api-and-mcp/api/data-sources-and-privacy
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Data Validation & Normalization Utilities
- Secondary Subcategories
- None listed
- Brand
- Delpha
- Access
- Account required
- First tracked
- 2026-10-30
- Tool count
- 16
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Your score is coming
ChatGPT now suggests Plugins on its own when they match a user's request.Your Plugin Discovery Score measures how often yours appears, and it will show here as soon as it’s ready.
What discovery looks like

Get alerts for Delpha
Get updates when Delpha’s Discoverability Score or category rank changes.
Competing in ChatGPT Data Validation & Normalization Utilities
View Category16 tools agents can invoke
Submit an asynchronous job to find and validate the LinkedIn page of a COMPANY: send `url` to validate one, or `company_name` (with `website` for precision) to search for one. Returns a `job_id` — pass it to `getLinkedInCompanyPageResult` to retrieve the canonical page URL plus accuracy and validity scores. Two modes: - Validate an existing page — supply `url`. - Search — supply `company_name`, adding `website` for precision. `findAndValidateLinkedInProfile` covers a PERSON — this operation looks for `/company/`, `/school/` and `/showcase/` pages only. These results are processed from the company website and from public web search: Google results, retrieved through Google Custom Search API or a SERP provider. No LinkedIn account, session or credential is used, and no third-party database is consulted. The company name and country you supply are sent to that search provider, and the company website you supply — or the domain of an email address you supply, which itself never leaves Delpha — is requested directly. A URL you submit for validation is never requested: its format is checked, and it may be searched for through that search provider. **Cost:** an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.
findAndValidateLinkedInCompanyPage
Submit an asynchronous job to find and validate the LinkedIn profile of a PERSON: send `url` to validate one, or `first_name` and `last_name` with `company_name` or `website` to search for one. Returns a `job_id` — pass it to `getLinkedInProfileResult` to retrieve the canonical profile URL plus accuracy and validity scores. Two modes: - Validate an existing profile — supply `url`. - Search — supply `first_name` + `last_name` plus company context (`company_name` and/or `website`); an `email` contributes only its domain, as `website` would. Company context narrows the search among people who share a name; without it a namesake can rank first, and for a very common name a namesake can rank first even with it. `findAndValidateLinkedInCompanyPage` covers a COMPANY's page — this operation looks for `/in/` profiles only. The search is built only from the fields in this request; nothing carries over from a previous job. These results are processed in real time from public web search: Google results, retrieved through Google Custom Search API or a SERP provider. No LinkedIn account, session or credential is used, and no contact database or third-party database is consulted. The name, company and country you supply are sent to that search provider. An email address you supply never leaves Delpha: only its domain is used, as a company website, and a company website is requested directly only when no name is given. A URL you submit for validation is never requested: its format is checked, and it may be searched for through that search provider. **Cost:** an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.
findAndValidateLinkedInProfile
Submit an asynchronous job to find and validate a company's legal identifier (SIRET, SIREN, NZBN, ABN, CIK, ...): send `legal_id` to validate one or `name` to search for one, plus `legal_id_type` or `address.country` to select the registry. The identifier is a business registry number, never a personal identifier. Returns a `job_id` — pass it to `getLegalIDResult` to retrieve the normalized identifier, the resolved `legal_id_type`, and validity / accuracy scores. **Registry selection:** the job targets one registry, resolved from either of two fields: - `legal_id_type` — the registry directly (e.g. `FRA - SIRET`, `GBR - COMPANY REGISTRATION NUMBER`), or - `address.country` — the entity's country, from which the registry is inferred. A call that provides neither is rejected with 400 (`Either 'legal_id_type' or 'address.country' must be provided`) — e.g. `{name, website}` alone fails. The remaining fields select the mode: `legal_id` runs validation and `name` runs search — a call with neither is rejected with 400; `website` only adds a country signal. **Coverage:** only the registries in the `legal_id_type` enum can be queried. A request naming any other registry, or a country that has no registry in that list, is refused with **422 `unsupported_registry`** *before any credit is reserved*; the message lists the supported countries. That refusal depends only on the registry or country requested, so the same country returns it again whatever `name` or `legal_id` carries. An explicit `legal_id_type` takes precedence over `address.country`, so a supported registry with an unsupported country still runs. The name or identifier you supply is matched against Delpha's company datalake and, when needed, the public registry of the selected country. A company found in a registry is added to the datalake. **Cost:** an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.
findAndValidateLegalID
Resolve a company's ultimate parent from one of its subsidiaries, brands or divisions: send `company_name` and `website`, both required. The parent returned is the **commercial parent**: the operating group the company is sold to and routed under. Passive holding entities set aside on the way up are flagged `is_discarded` in the ownership chain, and when a financial owner such as a fund sits above the operating group it is returned separately as `ultimate_financial_parent`. The result also carries the full ownership chain, the relationship type and a confidence score; each entity carries GLEIF metadata in `lei_data` when a match is found, `null` when none is. The resolution is anchored on the company's website, not on its name alone: the website binds the name to one specific entity and seeds the search. Ownership is resolved from a live web search plus GLEIF/LEI lookups, not from a static database. Async: poll `getUltimateParentResult` with the returned `job_id`. The company name, website and country you supply are sent to Delpha's AI providers, which search the web; the parent found is checked against GLEIF's public LEI register. **Cost:** an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.
findAndValidateUltimateParent
Submit an asynchronous job to find and validate a company's website: send `website` to validate one, or `name` with `country` (or `linkedin`) to search for one. Returns a `job_id` — pass it to `getWebsiteResult` to retrieve the canonical URL plus accuracy, validity, completeness, and consistency scores. Two modes: - Validate an existing URL — supply `website`. The tool checks reachability and matches the site against the other entity signals. A redirect destination is adopted when it shares the input's registrable domain, when the evidence ranks it above the original, or when a scored search candidate corroborates it; otherwise the normalized input is kept. - Search — supply entity signals (`name` + `country`, or `linkedin`; a bare domain sent as `website` is validated instead) and the tool finds the most likely website. `country` materially improves accuracy and disambiguates same-named companies across regions. Optional. The name and country you supply are sent to a web-search provider and to Delpha's AI provider. A website you supply, or one found by search, is visited to check it. **Cost:** an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.
findAndValidateWebsite
Find, validate, and qualify a person's email address: send `email` to verify it, or `first_name`, `last_name` and `website` together to search for it. Submit an asynchronous job; the returned `job_id` goes to `getEmailResult`, which yields the validated email, the `email_status` (Valid / ...), `email_domain_qualification` (whether the address's domain is a public/personal mail domain or a company domain, and whether it accepts mail at any address; see `getEmailResult`), the qualified domain, the scores (validity / completeness / accuracy / consistency), and ranked suggestions (both inferred from the input and from the company website). Two modes — at least one must be fully satisfied: - Validation mode: provide `email` alone to verify deliverability and qualify the domain. - Recommendation mode: provide `first_name`, `last_name`, AND `website` together (all three required) to search for the address. Partial recommendation inputs are rejected with 400. Supplying both an email and the recommendation triple runs both paths in the same job. This result comes from Delpha's own verification and a Delpha model; no contact database and no third-party database is used. Candidate addresses are generated from per-domain address patterns, not retrieved from a list of known addresses. The address you supply — or an address formed from the name and company website you supply — reaches the mail infrastructure of that address's own domain. **Cost:** an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.
findAndValidateEmail
Fetch the result of a previously submitted `findAndValidateLinkedInCompanyPage` job by `job_id`. On success, the `result` payload contains the canonical company page URL, accuracy and validity scores, and a `recommendations` array of candidate pages (each carrying `url`, `headline`, `desc`, `company_name`, `location`, and a confidence `score`) when the match is uncertain. In search mode the top-level `label` and scores are often `"No"` and 0 while `recommendations` still holds the candidates. Each candidate carries a `desc` and a `headline`; unrelated companies can share a name across countries, so those two fields are what tell them apart. **Result fields** (`result`, populated once `status_code == 200`): - `data_type` (string): The type of data for this field. One of: `email`, `social_network`, `name`, `legal_id`, `phone`, `address`, `website`. - `normalized_value` (string): Normalized LinkedIn company page URL. - `label` (string): Label for the LinkedIn value. One of: `No`, `OK`, `Unknown`. - `scores` (ScoresModel): Scores for the field. - `accuracy` (number): Accuracy score - `validity` (integer): Validity score - `completeness` (number): Completeness score - `consistency` (integer): Consistency score - `recommendations` (array of LinkedInCompanyPageRecommendation): Candidate company pages, best first. - `url` (string): Recommended LinkedIn company page URL (a `/company/`, `/school/` or `/showcase/` page). - `score` (number): Confidence score for the recommendation. - `headline` (string, nullable): The search result's headline — the title line Google renders for this page, usually the page name. - `rank` (integer, nullable): Rank of the recommendation. - `desc` (string, nullable): Description of the recommended page, as the search result renders it. - `company_name` (string, nullable): Company name shown on the recommended page. - `location` (string, nullable): Location shown on the recommended page. - `match_score` (number, nullable): Pure match quality of this candidate against the company in the request, before the ambiguity division. `score` = `match_score / ambiguity_n`. - `ambiguity_n` (integer, nullable): How many candidates scored within 10% of the best match. Greater than 1 means several pages match comparably well and the divided `score` reflects that ambiguity, not a poor match. - `recommendation_status` (string, nullable): Reading of the recommendation situation: 'confident' (one clear winner), 'ambiguous' (several candidates match comparably well — see each candidate's ambiguity_n), or 'no_match' (no credible page found). Vocabulary may grow; treat unknown values as informational. - `type` (string, nullable): The social network the assessed value belongs to. Always `linkedin` on these operations — Delpha assesses no other network today — it is provenance, not a discriminator. **Envelope:** `status_code` `200` means the job succeeded and `result` is populated; `202` means it is still running and `result` is `null`. A failed job comes back with `status` `"ERROR"`, its `status_code`, a stable `code` naming the cause and a `message` explaining it; an unknown or expired `job_id` is answered as a tool error. **Polling:** the MCP server holds this call and re-polls the job internally for up to ~25 seconds (this validation typically completes in ~10 seconds), so one call usually returns the final result. If `status_code` is still `202` after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. **Cost:** no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-out job failed. A repeat returns the same answer and never charges again.
getLinkedInCompanyPageResult
Fetch the result of a previously submitted `findAndValidateLinkedInProfile` job by `job_id`. On success, the `result` payload contains the canonical profile URL, accuracy and validity scores, and a `recommendations` array of candidate profiles (each carrying `url`, `headline`, `desc`, `company_name`, `location`, `profile_name`, and a confidence `score`) when the match is uncertain. In search mode the top-level `label` and scores are often `"No"` and 0 while `recommendations` still holds the candidates. A namesake can outrank the intended person even when company context was supplied, so `recommendations[0]` is a ranked candidate rather than a confirmed match; each candidate's `company_name` and `desc` are what distinguish one from another. **Result fields** (`result`, populated once `status_code == 200`): - `data_type` (string): The type of data for this field. One of: `email`, `social_network`, `name`, `legal_id`, `phone`, `address`, `website`. - `normalized_value` (string): Normalized LinkedIn profile URL. - `label` (string): Label for the LinkedIn value. One of: `No`, `OK`, `Unknown`. - `scores` (ScoresModel): Scores for the field. - `accuracy` (number): Accuracy score - `validity` (integer): Validity score - `completeness` (number): Completeness score - `consistency` (integer): Consistency score - `recommendations` (array of LinkedInRecommendation): Candidate profiles, best first. - `url` (string): Recommended LinkedIn profile URL. - `score` (number): Confidence score for the recommendation. - `headline` (string, nullable): The search result's headline — the title line Google renders for this profile, usually 'Name - job title - company'. ⚠️ This is NOT LinkedIn's 'headline' profile field — that is `job_title`. - `rank` (integer, nullable): Rank of the recommendation. - `desc` (string, nullable): Description of the recommended profile, as the search result renders it. - `company_name` (string, nullable): Company the person works at, as the recommended profile shows it. - `location` (string, nullable): Location shown on the recommended profile. - `profile_name` (string, nullable): The person's name on the recommended profile. - `job_title` (string, nullable): Job title of the recommended profile, as LinkedIn shows it. Usually taken from the structured job-title slot of the search result; when that is absent it falls back to the profile's LinkedIn headline, so it can read as free text ('Fortune 100 Executive | P&L Leader') rather than a clean role, and Google sometimes clips it with an ellipsis. Null when the search result carried no job title. - `match_score` (number, nullable): Pure match quality of this candidate against the person in the request, before the ambiguity division. `score` = `match_score / ambiguity_n`. - `ambiguity_n` (integer, nullable): How many candidates scored within 10% of the best match. Greater than 1 means several profiles match comparably well and the divided `score` reflects that ambiguity, not a poor match. - `recommendation_status` (string, nullable): Reading of the recommendation situation: 'confident' (one clear winner), 'ambiguous' (several candidates match comparably well — see each candidate's ambiguity_n), or 'no_match' (no credible profile found). Vocabulary may grow; treat unknown values as informational. - `fallback_used` (boolean, nullable): True when the emitted recommendations come from the name-only fallback search: no credible profile was found at the queried company, but same-name profiles exist elsewhere (a possible job-change signal). - `url_changed` (boolean, nullable): True when the submitted profile URL is probably outdated: it was not found, while exactly one other profile matching the person was found with confidence. LinkedIn does not redirect a profile whose address was changed, so the old address stops working. The replacement is in `suggested_url`. - `suggested_url` (string, nullable): The profile that probably replaces an outdated submitted URL, set only when `url_changed` is true. It is also the first recommendation. - `type` (string, nullable): The social network the assessed value belongs to. Always `linkedin` on these operations — Delpha assesses no other network today — it is provenance, not a discriminator. **Envelope:** `status_code` `200` means the job succeeded and `result` is populated; `202` means it is still running and `result` is `null`. A failed job comes back with `status` `"ERROR"`, its `status_code`, a stable `code` naming the cause and a `message` explaining it; an unknown or expired `job_id` is answered as a tool error. **Polling:** the MCP server holds this call and re-polls the job internally for up to ~25 seconds (this validation typically completes in ~10 seconds), so one call usually returns the final result. If `status_code` is still `202` after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. **Cost:** no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-out job failed. A repeat returns the same answer and never charges again.
getLinkedInProfileResult
Fetch the result of a previously submitted `findAndValidateEmail` job by `job_id`. On success, the `result` payload contains: the validated email (`normalized_value`); `email_status` (closed enum: `"Valid"`, `"Invalid"`, `"Unknown"`); `email_domain_qualification`, which reports two properties of the address's domain — whether it is a public/personal mail domain or a company domain, and whether it accepts mail at any address (closed enum: `"nominative@perso"` = a public/personal mail domain that rejects unknown addresses; `"catchall@perso"` = a public/personal mail domain that accepts any address; `"nominative@pro"` = a company domain that rejects unknown addresses; `"catchall@pro"` = a company domain that accepts any address, so acceptance is not evidence the mailbox exists; `"Unknown"` = the domain could not be classified, for instance because it greylisted the probe or its server failed temporarily); a top-level `label` summarising the outcome (closed enum: `"OK"`, `"No"`, `"OddFormat"`); the qualified domain; the four `scores` (validity, completeness, accuracy, consistency); and ranked `suggestions` (alternative addresses scored by likelihood) when no exact match is found. **Result fields** (`result`, populated once `status_code == 200`): - `label` (string): Label for the email. One of: `No`, `OK`, `OddFormat`. - `normalized_value` (string): Normalized email value. - `provider` (string, nullable): Provider of the email, if any. - `email_domain` (string, nullable): Domain of the email. `null` when the address carries no parseable domain (a syntactically invalid address, which returns `label: "No"`). - `email_domain_qualification` (string): Qualification of the email domain. One of: `nominative@pro`, `catchall@pro`, `nominative@perso`, `catchall@perso`, `Unknown`. - `email_status` (string): Status of the email. Possible values: 'Invalid', 'Unknown', 'Valid'. One of: `Invalid`, `Unknown`, `Valid`. - `email_address_qualification` (string, nullable): Address-level qualification of the mailbox, when one applies: `Spam Trap` (an address Delpha holds on a list of addresses used to detect unsolicited mail rather than read by a person) or `Role-based` (a shared functional mailbox such as `contact@`/`support@`, not a person). `null` means neither applies. ⚠️ This takes precedence over `email_domain_qualification`, which describes the DOMAIN rather than this address: a `Role-based` mailbox on a nominative professional domain is still role-based. The vocabulary may grow, so an unrecognised value is informational rather than an error. - `suggestions` (array of EmailSuggestion): Suggestions for the email. - `value` (string): Suggested email value. - `score` (number): Confidence score for the suggestion. - `website_domain` (string, nullable): Website domain associated. - `website_domain_qualification` (string, nullable): Qualification of the website domain. One of: `nominative@pro`, `catchall@pro`, `nominative@perso`, `catchall@perso`, `Unknown`. - `suggestions_from_website` (array of EmailSuggestion): Suggestions from the website. Fields as in `suggestions`. - `data_type` (string): The type of data for this field One of: `email`, `social_network`, `name`, `legal_id`, `phone`, `address`, `website`. - `scores` (ScoresModel): Scores for the field - `accuracy` (number): Accuracy score - `validity` (integer): Validity score - `completeness` (number): Completeness score - `consistency` (integer): Consistency score **Envelope:** `status_code` `200` means the job succeeded and `result` is populated; `202` means it is still running and `result` is `null`. A failed job comes back with `status` `"ERROR"`, its `status_code`, a stable `code` naming the cause and a `message` explaining it; an unknown or expired `job_id` is answered as a tool error. **Polling:** the MCP server holds this call and re-polls the job internally for up to ~180 seconds (this validation typically completes in ~5 seconds), so one call usually returns the final result. If `status_code` is still `202` after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. **Cost:** no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-out job failed. A repeat returns the same answer and never charges again.
getEmailResult
Fetch the result of a previously submitted `findAndValidateLegalID` job by `job_id`. On success, the `result` payload contains the normalized legal identifier, the resolved `legal_id_type` (which registry it belongs to), the validity / accuracy scores, a `match` object with the enriched company record (account name, address, annual revenue, employee count, industry, formation date, company type, website) when a confident match is found, and a `suggestions` array of alternative company records each ranked by confidence. **Result fields** (`result`, populated once `status_code == 200`): - `data_type` (string): The type of data for this field One of: `email`, `social_network`, `name`, `legal_id`, `phone`, `address`, `website`. - `normalized_value` (string): Normalized legal ID value. - `label` (string): Label for the legal ID. One of: `No`, `OK`, `Unknown`. - `legal_id_type` (string, nullable): The type of legal ID. Free-form: it normally matches one of the types accepted on submission. Null when no registry could be determined. - `scores` (ScoresModel): Scores for the field - `accuracy` (number): Accuracy score - `validity` (integer): Validity score - `completeness` (number): Completeness score - `consistency` (integer): Consistency score - `match` (LegalIDSuggestion, nullable): The match information - `score` (number): Confidence score for the suggestion. - `account_name` (string): The account name - `industry` (IndustryModel, nullable): The industry information - `website` (Website, nullable): The website - `address` (LegalIDAddress, nullable): The address information - `financials` (Financials, nullable): Filed financial figures for the company's most recent fiscal period, as published by its national register. Replaces the former `annual_revenue` field, which is no longer returned. - `employees_nb` (EmployeesNbModel, nullable): The employee number information - `source` (string, nullable): The source URL - `company_type` (CompanyTypeModel, nullable): The company type information - `date` (DateModel, nullable): The date information - `legal_id_type` (string): The legal ID type. Free-form: it normally matches one of the types accepted on submission, but a record sourced from the datalake may carry a historical type. - `legal_id` (string): The legal ID - `headquarters_site` (HeadquartersSite, nullable): The suggested entity's headquarters site, with its legal identifier — resolved from the datalake's parent link, never from the top of the ownership group. `null` when the record names no parent; the `legal_id` alone is absent when the parent record could not be resolved, and the name then falls back to the one stored inline on the link. - `site_type` (string, nullable): Whether this record is the company's headquarters: 'headquarters', 'branch', or 'unknown' when the datalake holds no value. Open vocabulary -- new values may be added, so treat this as a string, not a closed enum. - `vat` (string, nullable): The VAT identifier of the suggested entity, when the datalake has one. - `suggestions` (array of LegalIDSuggestion): Suggestions for the legal ID. Fields as in `match`. **Envelope:** `status_code` `200` means the job succeeded and `result` is populated; `202` means it is still running and `result` is `null`. A failed job comes back with `status` `"ERROR"`, its `status_code`, a stable `code` naming the cause and a `message` explaining it; an unknown or expired `job_id` is answered as a tool error. **Polling:** the MCP server holds this call and re-polls the job internally for up to ~25 seconds (this validation typically completes in ~5-10 seconds), so one call usually returns the final result. If `status_code` is still `202` after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. **Cost:** no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-out job failed. A repeat returns the same answer and never charges again.
getLegalIDResult
Fetch the result of a previously submitted `validateAndNormalizeName` job by `job_id`. On success, the `result` payload contains the normalized first / last name, a `label` (e.g. `OK`), per-field scores (`validity`, `completeness`, `consistency`, `misspelled` — each broken down into `{first_name, last_name}` objects — plus scalar `accuracy` and `reversed` (likelihood the first/last name are swapped)), and ranked `suggestions` for both `first_name` and `last_name` carrying alternative spellings with confidence scores. **Result fields** (`result`, populated once `status_code == 200`): - `data_type` (string): The type of data for this field One of: `email`, `social_network`, `name`, `legal_id`, `phone`, `address`, `website`. - `normalized_value` (NormalizedNameModel): Normalized name value. - `first_name` (string): The first name of the entity - `last_name` (string): The last name of the entity - `label` (string): Label for the name. One of: `No`, `OK`, `Misspelled`, `Reversed`. - `scores` (NameScoresModel): Scores for the field - `accuracy` (number): The accuracy of the name - `reversed` (number): The reversed of the name - `misspelled` (DoubleScoresModel): The misspelled of the names - `consistency` (DoubleScoresModel): The consistency of the names Fields as in `misspelled`. - `validity` (DoubleScoresModel): The validity of the names Fields as in `misspelled`. - `completeness` (DoubleScoresModel): The completeness of the names Fields as in `misspelled`. - `suggestions` (NameRecommendation): Recommendations for the name. - `first_name` (array of SingleNameRecommendation): The first name of the entity - `last_name` (array of SingleNameRecommendation): The last name of the entity Fields as in `first_name`. **Envelope:** `status_code` `200` means the job succeeded and `result` is populated; `202` means it is still running and `result` is `null`. A failed job comes back with `status` `"ERROR"`, its `status_code`, a stable `code` naming the cause and a `message` explaining it; an unknown or expired `job_id` is answered as a tool error. **Polling:** the MCP server holds this call and re-polls the job internally for up to ~25 seconds (this validation typically completes in ~5 seconds), so one call usually returns the final result. If `status_code` is still `202` after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. **Cost:** no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-out job failed. A repeat returns the same answer and never charges again.
getNameResult
Fetch the result of a previously submitted `validateAndNormalizePhone` job by `job_id`. On success, the `result` payload contains the E.164-formatted `normalized_value`, the `phone_type` (one of `FIXED_LINE`, `MOBILE`, `FIXED_LINE_OR_MOBILE`, `TOLL_FREE`, `PREMIUM_RATE`, `SHARED_COST`, `VOIP`, `PERSONAL_NUMBER`, `PAGER`, `UAN`, `VOICEMAIL`), the `carrier` name, the `timezone`, the `zone` (ISO 3166-1 alpha-2 country code), the `area` (an English place name for the number — a city or region for many fixed lines, otherwise usually the country; empty when no place is known), and the `validity`, `completeness` and `consistency` scores with a `confidence` rating of the parse. `accuracy` is not assessed for phone numbers and is always `-1`. **Result fields** (`result`, populated once `status_code == 200`): - `data_type` (string): The type of data for this field One of: `email`, `social_network`, `name`, `legal_id`, `phone`, `address`, `website`. - `normalized_value` (string, nullable): Normalized phone value. - `phone_type` (string, nullable): The type of phone number One of: `FIXED_LINE`, `MOBILE`, `FIXED_LINE_OR_MOBILE`, `TOLL_FREE`, `PREMIUM_RATE`, `SHARED_COST`, `VOIP`, `PERSONAL_NUMBER`, `PAGER`, `UAN`, `VOICEMAIL`. - `carrier` (string, nullable): The carrier of the phone number - `timezone` (string, nullable): The timezone of the phone number - `zone` (string, nullable): The zone of the phone number - `area` (string, nullable): The area of the phone number - `activity_score` (integer, nullable): How recently the line has shown activity, on the second-tier line-type provider's own 0-100 scale. `null` whenever that provider was not consulted — which is the common case, since it is called only to resolve an ambiguous line type. - `is_prepaid` (boolean, nullable): Whether the number is a prepaid line, from the second-tier line-type provider. `null` whenever that provider was not consulted — see `activity_score`. - `scores` (PhoneScoresModel): Scores for the field - `accuracy` (number): Accuracy score - `validity` (integer): Validity score - `completeness` (number): Completeness score - `consistency` (integer): Consistency score - `confidence` (number): How much to trust the normalization, from the phone library's own reliability verdict: `1` (high), `0.5` (medium) or `0` (low, or not reported). It rates the PARSE, not whether the line is reachable — that is `validity`. **Envelope:** `status_code` `200` means the job succeeded and `result` is populated; `202` means it is still running and `result` is `null`. A failed job comes back with `status` `"ERROR"`, its `status_code`, a stable `code` naming the cause and a `message` explaining it; an unknown or expired `job_id` is answered as a tool error. **Polling:** the MCP server holds this call and re-polls the job internally for up to ~25 seconds (this validation typically completes in ~5 seconds), so one call usually returns the final result. If `status_code` is still `202` after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. **Cost:** no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-out job failed. A repeat returns the same answer and never charges again.
getPhoneResult
Fetch the result of a previously submitted `findAndValidateUltimateParent` job by `job_id`. The resolver walks ownership upward from the queried company and returns as `ultimate_parent` the **commercial parent** — the operating group the company is sold to and routed under, not necessarily the top legal owner. Passive holding entities set aside on the way up stay in `ownership_chain` flagged `is_discarded`; when a financial owner such as a fund sits above the operating group, it is returned separately as `ultimate_financial_parent`. Top-level `result` fields: `ultimate_parent` (`CompanyEntity`), `relationship_type` (`Wholly Owned` / `Joint Venture` / `Member Firm/Franchise` / `Portfolio Company` / `Brand/Division` / `Independent`), `confidence` (a number in `[0, 1]` reported by the resolver), `comment`, `source_url` (cited URL, may be `null`), `ownership_chain` (**bottom-up** array; index 0 is the queried company), and `ultimate_financial_parent` (`CompanyEntity` or `null`). Each `CompanyEntity` carries `legal_name`, `commercial_name`, `country`, `website`, `website_validated`, `is_ultimate_financial_parent`, `is_discarded` and `lei_data` (GLEIF metadata or `null`). **Result fields** (`result`, populated once `status_code == 200`): - `ultimate_parent` (CompanyEntity): The commercial parent of the requested company: the operating group it is sold to and routed under. - `legal_name` (string, nullable): The official legal name of the entity. - `commercial_name` (string, nullable): The commonly-used commercial / trade name. - `country` (string, nullable): The country where the entity is headquartered or registered. - `website` (string, nullable): The entity's primary website URL. - `website_validated` (boolean, nullable): True if the website was reachable and resolved cleanly during normalization. - `lei_data` (LeiData, nullable): GLEIF Legal Entity Identifier metadata. Null if no match was found at >=80 fuzzy-match score. - `is_ultimate_financial_parent` (boolean): True for the chain entity that the resolver identified as the ultimate financial parent (when it differs from the commercial parent returned as `ultimate_parent`). - `entity_type` (string, nullable): The entity's legal form / classification as identified by the resolver (e.g., 'Corporation', 'Holding Shell/Foundation', 'Trust'). - `ownership_status` (string, nullable): Free-form ownership status of the entity as reported by the resolver (e.g., 'Unknown', 'Active'). - `is_discarded` (boolean, nullable): True when the resolver excluded this entity from the strategic operating chain (e.g., passive holding companies above an operating conglomerate). Lets callers distinguish operating links from holding overlays. - `comment` (string, nullable): Per-entity annotation from the resolver (e.g., 'Target operating entity', 'Passive holding for control purposes'). - `relationship_type` (string, nullable): How the requested company relates to the ultimate parent. One of: `Wholly Owned`, `Member Firm/Franchise`, `Portfolio Company`, `Brand/Division`, `Independent`, `Joint Venture`. - `confidence` (number): Resolver-reported confidence score in the resolved ultimate parent, from 0 to 1. - `ownership_chain` (array of CompanyEntity): Ordered chain from the requested company up to the ultimate parent. Empty if the requested company IS the ultimate parent. May contain intermediate holding entities; the entity with `is_ultimate_financial_parent=True` (if any) is also exposed at top level as `ultimate_financial_parent` for convenience. Fields as in `ultimate_parent`. - `ultimate_financial_parent` (CompanyEntity, nullable): Populated only when the ultimate financial parent differs from the commercial parent returned as `ultimate_parent` (e.g., a fund above the operating group is the actual financial owner). When populated, this is the same object as the chain entity whose `is_ultimate_financial_parent` is True. Fields as in `ultimate_parent`. - `comment` (string, nullable): The resolver's reasoning for the resolved hierarchy, as text. Useful for verification / auditability. - `source_url` (string, nullable): A URL the resolver cited as the basis for its conclusion (typically the parent's IR page or annual report). - `subsidiary_commercial_name` (string, nullable): The resolver's normalized commercial name for the queried (input) company. Useful when callers pass a fuzzy or legal name and want to see how it was resolved. - `ultimate_parent_source_level` (string, nullable): The authority level of the evidence the resolver relied on for the ultimate-parent conclusion (e.g., 'Securities Filing', 'Annual Report', 'Press Release'). - `evidence_summary` (string, nullable): One-line trace summarizing the resolver's reasoning steps (identity verification, chain traversal, discard logic, GTM selection). Useful for audit and debugging. - `is_self_ultimate` (boolean, nullable): True when the queried company is its own ultimate parent (no further hierarchy above it). **Envelope:** `status_code` `200` means the job succeeded and `result` is populated; `202` means it is still running and `result` is `null`. A failed job comes back with `status` `"ERROR"`, its `status_code`, a stable `code` naming the cause and a `message` explaining it; an unknown or expired `job_id` is answered as a tool error. **Polling:** the MCP server holds this call and re-polls the job internally for up to ~280 seconds (this validation typically completes in 30 seconds to a few minutes), so one call usually returns the final result. If `status_code` is still `202` after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. **Cost:** no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-out job failed. A repeat returns the same answer and never charges again.
getUltimateParentResult
Fetch the result of a previously submitted `findAndValidateWebsite` job by `job_id`. On success, the `result` payload contains the `normalized_value` URL, a `label` (e.g. `OK`), the four `scores` (validity, completeness, accuracy, consistency), and a `recommendations` array of alternative URLs each ranked by confidence. A redirect destination is adopted when it shares the input's registrable domain, when the evidence ranks it above the original, or when a scored search candidate corroborates it; otherwise the normalized input is kept. An adopted URL is reduced to `scheme://host/`, and a corroborated host may replace its host. `Changed` reports exactly that adopted move; `Unknown` means the request named no company, so accuracy had no basis, and is not a negative verdict on the URL. **Result fields** (`result`, populated once `status_code == 200`): - `data_type` (string): The type of data for this field One of: `email`, `social_network`, `name`, `legal_id`, `phone`, `address`, `website`. - `normalized_value` (string): Normalized website value. - `label` (string): Accuracy verdict for the submitted website. `OK` — the search confirmed it. `Changed` — the site has moved: a redirect landed on a different registrable domain and the evidence ranked that destination above the original, so it was adopted. `No` — a request that named a company found nothing supporting this website. `Unknown` — the request named no company, so accuracy had no basis (`-1`); this is not a negative verdict on the URL. A redirect destination is adopted when it shares the input's registrable domain, or when the evidence ranks it above the original, or when a scored search candidate corroborates it — otherwise the normalized input is kept, which is what happens to a same-name different-TLD landing the evidence does not prefer. An adopted URL is reduced to `scheme://host/`, possibly using a corroborated host. One of: `No`, `OK`, `Changed`, `Unknown`. - `scores` (ScoresModel): Scores for the field - `accuracy` (number): Accuracy score - `validity` (integer): Validity score - `completeness` (number): Completeness score - `consistency` (integer): Consistency score - `recommendations` (array of WebsiteRecommendation): Recommendations for the website. - `url` (string): Recommended website value. - `score` (number): Confidence score for the recommendation. - `metadata` (WebsiteMetadata, nullable): Google-search metadata (name, title, summary, rank) for the recommended website. Null when the recommendation comes from a path that does not produce search metadata (email-domain, social-network, or direct-website validation). - `source_path` (array of object): Ordered list of upstream blocks that produced this recommendation, each tagged with a `name`. Allows downstream consumers to attribute a recommendation to the engine path it came from (e.g. `[{"name": "Name"}]` for Google search by company name). **Envelope:** `status_code` `200` means the job succeeded and `result` is populated; `202` means it is still running and `result` is `null`. A failed job comes back with `status` `"ERROR"`, its `status_code`, a stable `code` naming the cause and a `message` explaining it; an unknown or expired `job_id` is answered as a tool error. **Polling:** the MCP server holds this call and re-polls the job internally for up to ~25 seconds (this validation typically completes in ~10 seconds), so one call usually returns the final result. If `status_code` is still `202` after that, the job is still running and this tool accepts the same job id again. Re-reading a result never re-runs or re-charges the job. **Cost:** no new charge. Reading a result finalizes the job's accounting once: it settles the charge made at submission when the result is first delivered, or refunds it when the job failed, exceeded its time limit or produced no usable result, and marks a timed-out job failed. A repeat returns the same answer and never charges again.
getWebsiteResult
Submit an asynchronous job to validate and normalize a person's name: send `first_name` and `last_name`, both required. Returns a `job_id` — pass it to `getNameResult` to retrieve the normalized first / last name, the validity / completeness / consistency scores, the misspelled and reversed scores, and ranked alternative spellings. Normalization fixes capitalization and spacing. In the last name it also drops a recognized title or suffix (e.g. `Smith PhD` becomes `SMITH`) and anything in parentheses or after a comma; the first name keeps its words. Characters outside the Latin script are removed — a name written entirely in another script normalizes to an empty string. It is meant for a name already held in a record — to clean it up before the record is used or stored, or to catch a typo or a first and last name entered the wrong way round. It does not search: it does not look a person up or return anything about them beyond the name itself, and everything it returns is derived from the two names supplied and Delpha's own reference data. Both `first_name` and `last_name` are required. This result is computed inside Delpha's own infrastructure, from the name you supply and Delpha's own reference data. Nothing leaves Delpha for this operation, and the submitted name is retained in your account's resolution history for its configured retention period. **Cost:** an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.
validateAndNormalizeName
Submit an asynchronous job to validate and normalize a phone number you supply: send `phone`, with `country_code` when it is not in E.164 form. Returns a `job_id` — pass it to `getPhoneResult` to retrieve the E.164-formatted number, its line type, carrier, time zone and country, validity / completeness / consistency scores, and a `confidence` rating of the parse. `phone` is required. A number in E.164 form (e.g. `+33672557378`) carries its own country. A national-format number (e.g. `0672557378`) is normalized only when its country is supplied — `country_code` (ISO 3166-1 alpha-2); one sent without a country is rejected with 400. It is meant for a number already held in a record — to check it before the record is used or stored, or to bring numbers into one format. It does not search: it finds no phone number for a person or a company, and everything it returns describes the number supplied. This result is obtained by parsing the submitted number and verifying it against data from carriers and cross-carrier network enablers, through Delpha's providers. Delpha verifies only the number itself (validity, line type, carrier, connection status) and does not link it to an individual, a name or any other personal data. Those providers receive the number in E.164 form and a two-letter country code, and nothing else. **Cost:** an accepted call spends 1 credit and starts a new job; a repeat with the same input starts another and is charged again. The call and its result are kept in your team's resolution history for its configured retention.
validateAndNormalizePhone
Delpha ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Delpha's ChatGPT Plugin discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Delpha alternatives on ChatGPT?
As of 2026-10-30, Delpha competes with Bank Statement Conversion, Category Reference Mapping, CSV Column Mapping Plan, Customer Info Validator, DataCleanist, Delivery Report Extractor, Duplicate Record Audit, Fraud Blocker and 11 more in ChatGPT Data Validation & Normalization Utilities, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.