apyhub
Back

World Bank Restricted Firms Screening API

World Bank Restricted Firms Screening API checks whether firms appear on the World Bank Group’s debarred or cross-debarred firms list. Send firm names for screening, and it returns whether a match was found along with the matched firm’s name, country, aliases, registration details, sanction status, sanction basis, and ineligibility dates. Use it for supplier screening, procurement workflows, partner due diligence, onboarding, and compliance checks.

The API supports batch screening, allowing multiple firm names to be checked in a single request. Its fuzzy matching handles common differences such as spelling variations, accents, punctuation, word order, legal-form suffixes, and alternative firm names, making it useful when submitted firm names do not exactly match the listed records.

You can also browse and filter debarred firms, retrieve detailed firm information and change history, access reference codes, and track firms that have been added, removed, or changed over time. This makes the API suitable for automated compliance workflows that need to screen firms and stay updated with changes to the World Bank debarment list

▣ ENDPOINT 01 / 06
GET
Screen a Company Against the Debarment List
https://api.eu.apyhub.com/193market/world-bank-debarred-firms-screening-api/screen

QUICKSTART

GUIDE

Quickstart

curl "https://api.eu.apyhub.com/193market/world-bank-debarred-firms-screening-api/screen?name=APPLUS%20SERVICIOS%20INTEGRALES%2C%20SAS&threshold=0.5" \
  -H 'apy-token: $APY_TOKEN'

What you will get

{
  "query": {
    "name": "APPLUS SERVICIOS INTEGRALES, SAS",
    "normalised": "APPLUS SERVICIOS INTEGRALES",
    "country": null,
    "threshold": 0.5
  },
  "matched": true,
  "best_score": 1,
  "matches": [
    {
      "match_score": 1,
      "matched_name": "APPLUS SERVICIOS INTEGRALES, SAS",
      "matched_on": "name",
      "shared_distinctive_words": [
        "APPLUS",
        "SERVICIOS",
        "INTEGRALES"
      ],
      "id": 1102469,
      "name": "APPLUS SERVICIOS INTEGRALES, SAS",
      "entity_type": "firm",
      "other_names": [],
      "native_script_names": [],
      "registration_numbers": [],
      "country": {
        "code": "CO",
        "name": "Colombia"
      },
      "city": "BOGOTÁ",
      "status": "cross_debarred",
      "currently_ineligible": true,
      "ineligible_from": "2026-06-26",
      "ineligible_to": "2027-07-10",
      "permanent": false,
      "basis": "Cross Debarment: EBRD",
      "cross_debarment_by": "EBRD",
      "controlled_affiliate_of_sanctioned_entity": false,
      "sanction_scope_note": null,
      "listed_since": "2026-06-26",
      "on_current_list": true
    }
  ],
  "data_freshness": {
    "list_checked_at": "2026-09-25T10:33:14+00:00",
    "list_changed_at": "2026-09-25T10:33:14+00:00",
    "firms_on_list": 1249
  }
}
TRY ITLIVE · 10 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
Company name in Latin letters, any legal suffix, e.g. Roprucsa
Maximum matches, 1–20
Minimum match score 0.5–1.0 (default 0.8)

About this endpoint

What it does

Checks one firm name against the debarred and cross-debarred firms list. Matching handles accents, punctuation, word order, legal-form suffixes, and small spelling differences. You can narrow candidates by country and control the minimum match score and number of returned matches.

Query Parameter(s)

ParameterTypeMandatoryDescription
nameStringYesCompany name in Latin letters; 2–200 characters.
limitIntegerNoMaximum matches to return. Range: 1–20. Default: 5.
countryStringNoISO country code used to narrow candidate matches.
thresholdNumberNoMinimum match score from 0.5 to 1.0. Default: 0.8.

Response

FieldTypeDescription
query.nameStringCompany name submitted for screening.
query.normalisedStringNormalised form used for matching.
query.countryString / nullCountry filter applied to the request.
query.thresholdNumberMatch threshold used for the screening.
matchedBooleanWhether at least one matching firm was found.
best_scoreNumberHighest match score returned.
matchesArrayMatching firm records.
matches[].idIntegerUnique firm identifier.
matches[].nameStringListed firm name.
matches[].entity_typeStringEntity type.
matches[].other_namesArrayOther recorded names.
matches[].native_script_namesArrayNames recorded in native scripts.
matches[].registration_numbersArrayRegistration numbers.
matches[].countryObjectCountry information.
matches[].cityString / nullRecorded city.
matches[].statusStringDebarment status.
matches[].currently_ineligibleBooleanWhether the firm is currently ineligible.
matches[].ineligible_fromStringStart date of ineligibility.
matches[].ineligible_toString / nullEnd date of ineligibility.
matches[].permanentBooleanWhether the ineligibility is permanent.
matches[].basisStringBasis for the debarment.
matches[].cross_debarment_byString / nullCross-debarment bank, when applicable.
matches[].controlled_affiliate_of_sanctioned_entityBooleanWhether the firm is a controlled affiliate.
matches[].sanction_scope_noteString / nullRecorded sanction limitation, if any.
matches[].listed_sinceString / nullDate the firm was added to the list.
matches[].on_current_listBooleanWhether the firm is on the current list.
▣ ENDPOINT 02 / 06
POST
Screen Multiple Companies Against the Debarment List
https://api.eu.apyhub.com/193market/world-bank-debarred-firms-screening-api/screen/batch

QUICKSTART

GUIDE

Quickstart

curl -X POST "https://api.eu.apyhub.com/193market/world-bank-debarred-firms-screening-api/screen/batch" \
  -H 'apy-token: $APY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"names":["INSHA TRADE CORPORATION","Medical Items","Enterprise Babati"],"threshold":0.8}'

What you will get

{
  "count": 3,
  "screened": 3,
  "results": [
    {
      "query": {
        "name": "INSHA TRADE CORPORATION",
        "normalised": "INSHA TRADE",
        "country": null,
        "threshold": 0.8
      },
      "matched": true,
      "best_score": 1,
      "matches": [
        {
          "match_score": 1,
          "matched_name": "INSHA TRADE CORPORATION",
          "matched_on": "name",
          "shared_distinctive_words": [
            "INSHA",
            "TRADE"
          ],
          "id": 1017035,
          "name": "INSHA TRADE CORPORATION",
          "entity_type": "firm",
          "other_names": [],
          "native_script_names": [],
          "registration_numbers": [],
          "country": {
            "code": "BD",
            "name": "Bangladesh"
          },
          "city": "DHAKA-1000",
          "status": "debarred",
          "currently_ineligible": true,
          "ineligible_from": "2026-09-10",
          "ineligible_to": "2029-09-09",
          "permanent": false,
          "basis": "Fraudulent Practice",
          "cross_debarment_by": null,
          "controlled_affiliate_of_sanctioned_entity": false,
          "sanction_scope_note": null,
          "listed_since": "2020-07-13",
          "on_current_list": true
        }
      ]
    },
    {
      "query": {
        "name": "Medical Items",
        "normalised": "MEDICAL ITEMS",
        "country": null,
        "threshold": 0.8
      },
      "matched": true,
      "best_score": 1,
      "matches": [
        {
          "match_score": 1,
          "matched_name": "MEDICAL ITEMS",
          "matched_on": "name",
          "shared_distinctive_words": [
            "MEDICAL",
            "ITEMS"
          ],
          "id": 1112457,
          "name": "MEDICAL ITEMS",
          "entity_type": "firm",
          "other_names": [],
          "native_script_names": [],
          "registration_numbers": [
            "RCCM-NI-NIA-2011-B-1536"
          ],
          "country": {
            "code": "NE",
            "name": "Niger"
          },
          "city": "NIAMEY",
          "status": "debarred",
          "currently_ineligible": true,
          "ineligible_from": "2026-08-04",
          "ineligible_to": "2029-07-03",
          "permanent": false,
          "basis": "Controlled Affiliate of a Sanctioned Entity.",
          "cross_debarment_by": null,
          "controlled_affiliate_of_sanctioned_entity": true,
          "sanction_scope_note": null,
          "listed_since": "2026-08-04",
          "on_current_list": true
        }
      ]
    },
    {
      "query": {
        "name": "Enterprise Babati",
        "normalised": "ENTERPRISE BABATI",
        "country": null,
        "threshold": 0.8
      },
      "matched": true,
      "best_score": 0.957,
      "matches": [
        {
          "match_score": 0.957,
          "matched_name": "ENTREPRISE BABATI",
          "matched_on": "name",
          "shared_distinctive_words": [
            "ENTREPRISE",
            "BABATI"
          ],
          "id": 1112455,
          "name": "ENTREPRISE BABATI",
          "entity_type": "firm",
          "other_names": [],
          "native_script_names": [],
          "registration_numbers": [
            "RCCM/NIG/TAH/2011/B/109"
          ],
          "country": {
            "code": "NE",
            "name": "Niger"
          },
          "city": "NIAMEY",
          "status": "debarred",
          "currently_ineligible": true,
          "ineligible_from": "2026-08-04",
          "ineligible_to": "2029-07-03",
          "permanent": false,
          "basis": "Fraudulent Practice",
          "cross_debarment_by": null,
          "controlled_affiliate_of_sanctioned_entity": false,
          "sanction_scope_note": null,
          "listed_since": "2026-08-04",
          "on_current_list": true
        }
      ]
    }
  ],
  "data_freshness": {
    "list_checked_at": "2026-09-25T10:33:14+00:00",
    "list_changed_at": "2026-09-25T10:33:14+00:00",
    "firms_on_list": 1249
  }
}
TRY ITLIVE · 10 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
BatchRequest*
Names*
Up to 50 company names
Optional ISO country code applied to every name

About this endpoint

What it does

Screens multiple firm names in one request. Submit 1–50 names and optionally apply one country filter and one match threshold to the whole batch. Results are returned in the same order as the submitted names.

Request Body

ParameterTypeMandatoryDescription
namesString ArrayYesCompany names to screen. Minimum 1 and maximum 50.
countryString / nullNoISO country code applied to every submitted name.
thresholdNumberNoMinimum match score from 0.5 to 1.0. Default: 0.8.

Response

FieldTypeDescription
countIntegerNumber of names received.
screenedIntegerNumber of names screened.
resultsArrayOne screening result for each submitted name.
results[].queryObjectOriginal query details and matching settings.
results[].matchedBooleanWhether a matching firm was found.
results[].best_scoreNumberHighest match score for the submitted name.
results[].matchesArrayMatching firm records using the same firm fields as /screen.
data_freshnessObjectInformation about when the list was checked.
▣ ENDPOINT 03 / 06
GET
Firms on the list, filtered by country, basis or dates
https://api.eu.apyhub.com/193market/world-bank-debarred-firms-screening-api/firms

QUICKSTART

GUIDE

Quickstart

curl "https://api.eu.apyhub.com/193market/world-bank-debarred-firms-screening-api/firms?page=10&per_page=50" \
  -H 'apy-token: $APY_TOKEN'

What you will get

{
  "total": 1249,
  "page": 10,
  "per_page": 50,
  "results": [
    {
      "id": 888258,
      "name": "HEBEI CONSTRUCTION GROUP CORPORATION LIMITED CHENGDE CONCRETE BRANCH",
      "entity_type": "firm",
      "other_names": [],
      "native_script_names": [
        "河北天睿项目管理有限公司"
      ],
      "registration_numbers": [],
      "country": {
        "code": "CN",
        "name": "China"
      },
      "city": "CHENGDE CITY, HEBEI PROVINCE",
      "status": "cross_debarred",
      "currently_ineligible": true,
      "ineligible_from": "2024-08-22",
      "ineligible_to": "2027-07-22",
      "permanent": false,
      "basis": "Cross Debarment: ADB",
      "cross_debarment_by": "ADB",
      "controlled_affiliate_of_sanctioned_entity": false,
      "sanction_scope_note": null,
      "listed_since": "2024-08-22",
      "on_current_list": true
    },
    {
      "id": 888259,
      "name": "HEBEI CONSTRUCTION GROUP CORPORATION LIMITED CHENGDE SHAUNGLUAN CONCRETE BRANCH",
      "entity_type": "firm",
      "other_names": [],
      "native_script_names": [
        "河北建设集团股份有限公司混凝土分公司"
      ],
      "registration_numbers": [],
      "country": {
        "code": "CN",
        "name": "China"
      },
      "city": "CHENGDE CITY, HEBEI PROVINCE",
      "status": "cross_debarred",
      "currently_ineligible": true,
      "ineligible_from": "2024-08-22",
      "ineligible_to": "2027-07-22",
      "permanent": false,
      "basis": "Cross Debarment: ADB",
      "cross_debarment_by": "ADB",
      "controlled_affiliate_of_sanctioned_entity": false,
      "sanction_scope_note": null,
      "listed_since": "2024-08-22",
      "on_current_list": true
    }
  ]
}
TRY ITLIVE · 10 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.

About this endpoint

What it does

Browses the debarment list with pagination and optional filters for country, status, cross-debarment bank, listing date, and ineligibility start date.

Query Parameter(s)

ParameterTypeMandatoryDescription
countryStringNoISO country code filter.
statusStringNoFilter by debarred or cross_debarred.
cross_debarment_byStringNoFilter by ADB, AFDB, EBRD, or IDB.
listed_sinceStringNoOnly firms added on or after this date in YYYY-MM-DD format.
ineligible_from_sinceStringNoOnly firms whose ineligibility started on or after this date in YYYY-MM-DD format.
pageIntegerNoPage number. Default: 1.
per_pageIntegerNoResults per page. Range: 1–100. Default: 50.

Response

FieldTypeDescription
totalIntegerTotal number of firms matching the request.
pageIntegerCurrent page number.
per_pageIntegerNumber of records requested per page.
resultsArrayFirm records returned for the page.
results[].idIntegerUnique firm identifier.
results[].nameStringListed firm name.
results[].entity_typeStringEntity type.
results[].other_namesArrayOther recorded names.
results[].native_script_namesArrayNames recorded in native scripts.
results[].registration_numbersArrayRegistration numbers.
results[].countryObjectCountry information.
results[].cityString / nullRecorded city.
results[].statusStringDebarment status.
results[].currently_ineligibleBooleanWhether the firm is currently ineligible.
results[].ineligible_fromStringStart date of ineligibility.
results[].ineligible_toString / nullEnd date of ineligibility.
results[].permanentBooleanWhether the ineligibility is permanent.
results[].basisStringBasis for the debarment.
results[].cross_debarment_byString / nullCross-debarment bank, when applicable.
results[].controlled_affiliate_of_sanctioned_entityBooleanWhether the firm is a controlled affiliate.
results[].sanction_scope_noteString / nullRecorded sanction limitation, if any.
results[].listed_sinceString / nullDate the firm was added to the list.
results[].on_current_listBooleanWhether the firm is on the current list.
▣ ENDPOINT 04 / 06
GET
Firms added to, removed from or changed on the list
https://api.eu.apyhub.com/193market/world-bank-debarred-firms-screening-api/changes

QUICKSTART

GUIDE

Quickstart

curl "https://api.eu.apyhub.com/193market/world-bank-debarred-firms-screening-api/changes?since=2024-08-22" \
  -H 'apy-token: $APY_TOKEN'

What you will get

{
  "since": "2024-08-22",
  "tracking_since": "2026-09-21T23:18:51+00:00",
  "note": "the first snapshot records every firm as added; changes after that are real list changes",
  "results": [
    {
      "at": "2026-09-21T23:18:51+00:00",
      "kind": "added",
      "detail": null,
      "firm": {
        "id": 118351,
        "name": "ZHONGKE LIFE SCIENCE & TECHNOLOGY CO., LTD.",
        "entity_type": "firm",
        "other_names": [],
        "native_script_names": [],
        "registration_numbers": [],
        "country": {
          "code": "CN",
          "name": "China"
        },
        "city": "ZHEJIANG 313200",
        "status": "debarred",
        "currently_ineligible": true,
        "ineligible_from": "2011-07-26",
        "ineligible_to": null,
        "permanent": true,
        "basis": "Procurement Guidelines 1.14(a)(ii)",
        "cross_debarment_by": null,
        "controlled_affiliate_of_sanctioned_entity": false,
        "sanction_scope_note": null,
        "listed_since": null,
        "on_current_list": true
      }
    },
    {
      "at": "2026-09-21T23:18:51+00:00",
      "kind": "added",
      "detail": null,
      "firm": {
        "id": 322505,
        "name": "OLIVE HEALTH CARE",
        "entity_type": "firm",
        "other_names": [],
        "native_script_names": [],
        "registration_numbers": [],
        "country": {
          "code": "IN",
          "name": "India"
        },
        "city": "MUMBAI 400 022",
        "status": "debarred",
        "currently_ineligible": true,
        "ineligible_from": "2017-07-21",
        "ineligible_to": "2028-01-20",
        "permanent": false,
        "basis": "May 2010 Procurement Guidelines, Para. 1.14(a)(i) & (ii)",
        "cross_debarment_by": null,
        "controlled_affiliate_of_sanctioned_entity": false,
        "sanction_scope_note": null,
        "listed_since": "2015-09-02",
        "on_current_list": true
      }
    }
  ]
}
TRY ITLIVE · 10 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.
ISO date or datetime (UTC), e.g. 2026-09-01
1–200

About this endpoint

What it does

Returns incremental list changes from a specified date. Each event identifies when the change was recorded, whether the firm was added, removed, or changed, and the affected firm record.

Query Parameter(s)

ParameterTypeMandatoryDescription
sinceStringYesISO date or UTC datetime from which to return changes.
pageIntegerNoPage number. Default: 1.
per_pageIntegerNoResults per page. Range: 1–200. Default: 100.

Response

FieldTypeDescription
sinceStringDate or datetime used for the change feed.
tracking_sinceStringTimestamp from which the service began tracking changes.
noteStringExplains how the initial snapshot is represented in the change history.
resultsArrayChange events.
results[].atStringTimestamp of the change event.
results[].kindStringChange type, such as added, removed, or changed.
results[].detailString / nullAdditional change details, when available.
results[].firmObjectFirm affected by the change, using the firm record fields described above.
▣ ENDPOINT 05 / 06
GET
One firm, with its change history
https://api.eu.apyhub.com/193market/world-bank-debarred-firms-screening-api/firms/:firm_id

QUICKSTART

GUIDE

Quickstart

curl "https://api.eu.apyhub.com/193market/world-bank-debarred-firms-screening-api/firms/:firm_id/1102470" \
  -H 'apy-token: $APY_TOKEN'

What you will get

{
  "firm": {
    "id": 1102470,
    "name": "INGELOG COSTA RICA, S.A.",
    "entity_type": "firm",
    "other_names": [],
    "native_script_names": [],
    "registration_numbers": [],
    "country": {
      "code": "CR",
      "name": "Costa Rica"
    },
    "city": "OFICINA T&L CONSULTORES",
    "status": "cross_debarred",
    "currently_ineligible": true,
    "ineligible_from": "2026-06-26",
    "ineligible_to": "2027-07-10",
    "permanent": false,
    "basis": "Cross Debarment: EBRD",
    "cross_debarment_by": "EBRD",
    "controlled_affiliate_of_sanctioned_entity": false,
    "sanction_scope_note": null,
    "listed_since": "2026-06-26",
    "on_current_list": true
  },
  "history": [
    {
      "at": "2026-09-21T23:18:51+00:00",
      "kind": "added",
      "detail": null
    }
  ],
  "data_freshness": {
    "list_checked_at": "2026-09-25T10:33:14+00:00",
    "list_changed_at": "2026-09-25T10:33:14+00:00",
    "firms_on_list": 1249
  }
}
TRY ITLIVE · 10 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.

About this endpoint

What it does

Looks up one firm by its numeric ID and returns the firm's current details together with recorded change-history events.

Path Parameter

ParameterTypeMandatoryDescription
firm_idStringYesNumeric firm ID obtained from the screening or firms endpoints.

Response

FieldTypeDescription
firmObjectCurrent firm details.
firm.idIntegerUnique firm identifier.
firm.nameStringListed firm name.
firm.entity_typeStringEntity type.
firm.other_namesArrayOther recorded names.
firm.native_script_namesArrayNames recorded in native scripts.
firm.registration_numbersArrayRegistration numbers.
firm.countryObjectCountry information.
firm.cityString / nullRecorded city.
firm.statusStringDebarment status.
firm.currently_ineligibleBooleanWhether the firm is currently ineligible.
firm.ineligible_fromStringStart date of ineligibility.
firm.ineligible_toString / nullEnd date of ineligibility.
firm.permanentBooleanWhether the ineligibility is permanent.
firm.basisStringBasis for the debarment.
firm.cross_debarment_byString / nullCross-debarment bank, when applicable.
firm.controlled_affiliate_of_sanctioned_entityBooleanWhether the firm is a controlled affiliate.
firm.sanction_scope_noteString / nullRecorded sanction limitation, if any.
firm.listed_sinceString / nullDate the firm was added to the list.
firm.on_current_listBooleanWhether the firm is on the current list.
historyArrayRecorded firm change events.
history[].atStringTimestamp of the change event.
history[].kindStringChange type, such as added, removed, or changed.
history[].detailString / nullAdditional change details, when available.
data_freshnessObjectCurrent list freshness information.
▣ ENDPOINT 06 / 06
GET
What the fields mean
https://api.eu.apyhub.com/193market/world-bank-debarred-firms-screening-api/codes

QUICKSTART

GUIDE

Quickstart

curl "https://api.eu.apyhub.com/193market/world-bank-debarred-firms-screening-api/codes" \
  -H 'apy-token: $APY_TOKEN'

What you will get

{
  "status": {
    "debarred": "debarred by the World Bank itself",
    "cross_debarred": "debarred by another multilateral development bank and enforced by the World Bank under the 2010 Agreement for Mutual Enforcement of Debarment Decisions"
  },
  "match_score": "0–1. Accents, punctuation, word order and legal suffixes such as LTD, S.A. or GmbH are ignored. Each word is weighted by how rare it is on the list, so a shared common word such as CONSTRUCTION or CHINA counts little, and a match needs at least one rare word in common (small spelling differences allowed). Former names and trading names are checked too.",
  "matched_on": {
    "name": "the listed name",
    "other_name": "a former, trading or 'also known as' name recorded in the list's notes"
  },
  "currently_ineligible": "on the current list and the ineligibility end date has not passed (or is permanent)",
  "listed_since": "the date the World Bank added the entry to its list",
  "sanction_scope_note": "limits written in the list, e.g. 'only for its business operations in the water sector'",
  "data_freshness": {
    "list_checked_at": "2026-09-25T10:33:14+00:00",
    "list_changed_at": "2026-09-25T10:33:14+00:00",
    "firms_on_list": 1249
  }
}
TRY ITLIVE · 10 ATOMS
Loading your default key…
The full key is used to call the gateway and stays in this tab — never sent to orbit or saved.

About this endpoint

What it does

Returns reference definitions used by the other endpoints, including debarment statuses, match scoring, match source fields, current eligibility, listing dates, and sanction notes.

Response

FieldTypeDescription
statusObjectDefinitions for debarment status values.
status.debarredStringMeaning of the debarred status.
status.cross_debarredStringMeaning of the cross_debarred status.
match_scoreStringHow match scores are calculated and interpreted.
matched_onObjectFields that can produce a match.
matched_on.nameStringMeaning of a match against the listed name.
matched_on.other_nameStringMeaning of a match against a former, trading, or other recorded name.
currently_ineligibleStringDefinition of current ineligibility.
listed_sinceStringDefinition of the listed_since field.
sanction_scope_noteStringDefinition of the sanction_scope_note field.
data_freshnessObjectCurrent list freshness information.
▣ COMMON ERRORS

Errors any endpoint can return

400bad_request

Required parameter missing or malformed body.

401unauthorized

API key missing, revoked, or not authorized for this service.

429rate_limited

Your plan's per-second rate exceeded. Retry with exponential backoff.

503upstream_busy

Backend temporarily unavailable. Try again in a few seconds.