From 5e893c4be988cc5b79a521026025c286509e260e Mon Sep 17 00:00:00 2001 From: Dan Romano <1087791+krautrocker@users.noreply.github.com> Date: Mon, 17 Nov 2025 08:58:00 -0500 Subject: [PATCH 1/2] Initial release --- .../OpenSanctions/apiDefinition.swagger.json | 2558 +++++++++++++++++ .../OpenSanctions/apiSettings.json | 24 + .../OpenSanctions/readme.md | 75 + 3 files changed, 2657 insertions(+) create mode 100644 independent-publisher-connectors/OpenSanctions/apiDefinition.swagger.json create mode 100644 independent-publisher-connectors/OpenSanctions/apiSettings.json create mode 100644 independent-publisher-connectors/OpenSanctions/readme.md diff --git a/independent-publisher-connectors/OpenSanctions/apiDefinition.swagger.json b/independent-publisher-connectors/OpenSanctions/apiDefinition.swagger.json new file mode 100644 index 0000000000..71b7a4bcf7 --- /dev/null +++ b/independent-publisher-connectors/OpenSanctions/apiDefinition.swagger.json @@ -0,0 +1,2558 @@ +{ + "swagger": "2.0", + "info": { + "version": "yente 5.0.2", + "title": "OpenSanctions", + "description": "The OpenSanctions API lets you search and query the global sanctions and politically exposed persons (PEP) database. It provides endpoints for entity matching, text search, entity retrieval, and granular statement-level data. Use it to check people or companies against sanctions lists or explore the OpenSanctions entity graph.", + "contact": { + "email": "dan.romano@swolcat.com", + "name": "OpenSanctions", + "url": "https://developments.substack.com" + } + }, + "host": "api.opensanctions.org", + "x-ms-connector-metadata": [ + { + "propertyName": "Website", + "propertyValue": "https://www.opensanctions.org/" + }, + { + "propertyName": "Privacy policy", + "propertyValue": "https://www.opensanctions.org/docs/privacy/" + }, + { + "propertyName": "Categories", + "propertyValue": "Data" + } + ], + "basePath": "/", + "securityDefinitions": { + "api_key": { + "type": "apiKey", + "in": "query", + "name": "api_key" + } + }, + "schemes": [ + "https" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/match/{dataset}": { + "post": { + "summary": "Match entities against a dataset", + "x-ms-summary": "Match entities by name, DOB, and nationality", + "description": "Use this endpoint to match people or companies against a dataset using fuzzy name, date of birth, and nationality criteria. Returns scored match results with confidence thresholds.\n", + "tags": [ + "Matching" + ], + "operationId": "Match_match__dataset__post", + "deprecated": false, + "produces": [ + "application/json" + ], + "consumes": [ + "application/json" + ], + "parameters": [ + { + "name": "dataset", + "in": "path", + "required": true, + "type": "string", + "x-ms-visibility": "important", + "description": "Dataset or collection name to run the match query on.", + "x-ms-summary": "Target dataset name" + }, + { + "name": "limit", + "in": "query", + "required": false, + "default": 5, + "type": "integer", + "format": "int32", + "maximum": 500, + "description": "Maximum number of matches to return (1�500).", + "x-ms-summary": "Result limit" + }, + { + "name": "threshold", + "in": "query", + "required": false, + "default": 0.7, + "type": "number", + "format": "double", + "description": "Minimum score to include a result (0�1).", + "x-ms-summary": "Match threshold" + }, + { + "name": "cutoff", + "in": "query", + "required": false, + "default": 0.7, + "type": "number", + "format": "double", + "description": "Minimum acceptable score for best match cutoff.", + "x-ms-summary": "Cutoff score" + }, + { + "name": "algorithm", + "in": "query", + "required": false, + "default": "logic-v1", + "type": "string", + "description": "Matching algorithm to use, e.g., logic-v1.", + "x-ms-summary": "Algorithm version" + }, + { + "name": "include_dataset", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "description": "Datasets to explicitly include in the match.", + "x-ms-summary": "Included datasets" + }, + { + "name": "exclude_schema", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "description": "Schemas to exclude from the match process.", + "x-ms-summary": "Excluded schemas" + }, + { + "name": "exclude_dataset", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "description": "Datasets to exclude from the match process.", + "x-ms-summary": "Excluded datasets" + }, + { + "name": "topics", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "description": "Restrict matches to entities tagged with these topics.", + "x-ms-summary": "Topics filter" + }, + { + "name": "changed_since", + "in": "query", + "required": false, + "type": "string", + "description": "Only include entities changed since this ISO date.", + "x-ms-summary": "Changed since date" + }, + { + "name": "exclude_entity_ids", + "in": "query", + "required": false, + "default": [], + "type": "array", + "maxItems": 50, + "uniqueItems": false, + "items": { + "type": "string" + }, + "description": "Entity IDs to ignore during matching. Use to filter false positives or previously reviewed entities.\n", + "x-ms-summary": "Excluded entity IDs" + }, + { + "name": "Content-Type", + "in": "header", + "required": false, + "enum": [ + "application/json" + ], + "type": "string", + "description": "Content type of the request body (application/json).", + "x-ms-summary": "Content type header" + }, + { + "name": "body", + "in": "body", + "required": true, + "description": "EntityMatchQuery payload defining entities to match.", + "x-ms-summary": "Request body", + "schema": { + "$ref": "#/definitions/EntityMatchQuery" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "schema": { + "$ref": "#/definitions/EntityMatchResponse" + }, + "headers": {} + }, + "400": { + "description": "Invalid query", + "schema": { + "$ref": "#/definitions/ErrorResponse" + }, + "headers": {} + }, + "422": { + "description": "Validation Error", + "schema": { + "$ref": "#/definitions/HTTPValidationError" + }, + "headers": {} + }, + "500": { + "description": "Server error", + "schema": { + "$ref": "#/definitions/ErrorResponse" + }, + "headers": {} + } + }, + "x-ms-visibility": "important" + } + }, + "/search/{dataset}": { + "get": { + "summary": "Search entities in a dataset", + "x-ms-summary": "Text-based entity search by name or keyword", + "description": "Use this endpoint to search entities by name or keyword within a dataset. Supports field filters, fuzzy matching, and optional faceting.\n", + "tags": [ + "Matching" + ], + "operationId": "Search_search__dataset__get", + "deprecated": false, + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "dataset", + "in": "path", + "required": true, + "type": "string", + "x-ms-visibility": "important", + "description": "Dataset or collection to search within.", + "x-ms-summary": "Target dataset" + }, + { + "name": "q", + "in": "query", + "required": false, + "type": "string", + "description": "Text to search for, such as a name or keyword.", + "x-ms-summary": "Search query" + }, + { + "name": "schema", + "in": "query", + "required": false, + "default": "Thing", + "type": "string", + "description": "Restrict results to a specific schema (e.g., Person).", + "x-ms-summary": "Schema filter" + }, + { + "name": "include_dataset", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "description": "Only return entities from these datasets.", + "x-ms-summary": "Included datasets" + }, + { + "name": "exclude_dataset", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "description": "Exclude entities from these datasets.", + "x-ms-summary": "Excluded datasets" + }, + { + "name": "exclude_schema", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "description": "Exclude entities of these schema types.", + "x-ms-summary": "Excluded schemas" + }, + { + "name": "changed_since", + "in": "query", + "required": false, + "type": "string", + "description": "Only include entities updated since this ISO date.", + "x-ms-summary": "Changed since date" + }, + { + "name": "countries", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "description": "Filter by country codes (ISO 3166-1 alpha-2).", + "x-ms-summary": "Country filter" + }, + { + "name": "topics", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "description": "Restrict results to entities tagged with topics.", + "x-ms-summary": "Topics filter" + }, + { + "name": "datasets", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "description": "Filter by dataset identifiers.", + "x-ms-summary": "Datasets filter" + }, + { + "name": "filter", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "description": "Use syntax 'field:value' to filter fields, e.g., properties.birthDate:1985.\n", + "x-ms-summary": "Field filter" + }, + { + "name": "limit", + "in": "query", + "required": false, + "default": 10, + "type": "integer", + "format": "int32", + "maximum": 500, + "description": "Maximum number of results to return (1�500).", + "x-ms-summary": "Result limit" + }, + { + "name": "offset", + "in": "query", + "required": false, + "default": 0, + "type": "integer", + "format": "int32", + "maximum": 9499, + "description": "Starting offset for paged results.", + "x-ms-summary": "Result offset" + }, + { + "name": "sort", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "description": "Sort results by field, e.g., score:desc.", + "x-ms-summary": "Sort order" + }, + { + "name": "target", + "in": "query", + "required": false, + "type": "string", + "description": "Deprecated. Use the 'topics' parameter instead.", + "x-ms-summary": "Target (deprecated)" + }, + { + "name": "fuzzy", + "in": "query", + "required": false, + "default": false, + "type": "boolean", + "description": "Enable fuzzy text matching (approximate search).", + "x-ms-summary": "Fuzzy search" + }, + { + "name": "simple", + "in": "query", + "required": false, + "default": false, + "type": "boolean", + "description": "Simplify results by skipping detailed metadata.", + "x-ms-summary": "Simple mode" + }, + { + "name": "facets", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string", + "enum": [ + "datasets", + "schema", + "countries", + "identifiers", + "topics", + "genders" + ] + }, + "description": "Return facet counts for these fields.", + "x-ms-summary": "Facet fields" + }, + { + "name": "filter_op", + "in": "query", + "required": false, + "enum": [ + "AND", + "OR" + ], + "type": "string", + "description": "Logic to combine multiple filters (AND/OR).", + "x-ms-summary": "Filter operator" + } + ], + "responses": { + "200": { + "description": "Successful Response", + "schema": { + "$ref": "#/definitions/SearchResponse" + }, + "headers": {} + }, + "400": { + "description": "Invalid query", + "schema": { + "$ref": "#/definitions/ErrorResponse" + }, + "headers": {} + }, + "422": { + "description": "Validation Error", + "schema": { + "$ref": "#/definitions/HTTPValidationError" + }, + "headers": {} + }, + "500": { + "description": "Server error", + "schema": { + "$ref": "#/definitions/ErrorResponse" + }, + "headers": {} + } + }, + "x-ms-visibility": "important" + } + }, + "/healthz": { + "get": { + "summary": "Check API health status", + "x-ms-summary": "Basic health check for service availability", + "description": "Returns a simple status response confirming the API is reachable and operational. Commonly used by monitoring tools or Kubernetes liveness probes.\n", + "tags": [ + "System information" + ], + "operationId": "Healthz_healthz_get", + "deprecated": false, + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "API is healthy and responsive.", + "schema": { + "$ref": "#/definitions/StatusResponse" + } + }, + "500": { + "description": "Service unavailable or not ready.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + }, + "x-ms-visibility": "important" + } + }, + "/readyz": { + "get": { + "summary": "Check search index readiness", + "x-ms-summary": "Confirms if the search index is fully built", + "description": "Returns the status of the search index to indicate whether the API is ready to handle queries. Useful for monitoring startup and deployment readiness.\n", + "tags": [ + "System information" + ], + "operationId": "Readyz_readyz_get", + "deprecated": false, + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "Index is ready and service is operational.", + "schema": { + "$ref": "#/definitions/StatusResponse" + } + }, + "503": { + "description": "Index is still building or unavailable.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + }, + "x-ms-visibility": "important" + } + }, + "/algorithms": { + "get": { + "summary": "Get supported matching algorithms", + "x-ms-summary": "Lists available matching and scoring algorithms", + "description": "Retrieves a list of all supported matching and scoring algorithms used by the API for entity comparison and result ranking.\n", + "tags": [ + "System information" + ], + "operationId": "Algorithms_algorithms_get", + "deprecated": false, + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "Returns list of supported algorithms.", + "schema": { + "$ref": "#/definitions/AlgorithmResponse" + } + } + }, + "x-ms-visibility": "important" + } + }, + "/updatez": { + "post": { + "summary": "Force index regeneration", + "x-ms-summary": "Rebuilds the search index using an update token", + "description": "Triggers a manual rebuild of the search index. Requires a valid update token for authorization. Use this to refresh the dataset when data or structure changes occur.\n", + "tags": [ + "System information" + ], + "operationId": "Force_update_updatez_post", + "deprecated": false, + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "token", + "in": "query", + "required": false, + "type": "string", + "x-ms-visibility": "important", + "description": "API token required to authorize index rebuild.", + "x-ms-summary": "Update token" + }, + { + "name": "sync", + "in": "query", + "required": false, + "default": false, + "type": "boolean", + "x-ms-visibility": "important", + "description": "Run synchronously and wait for index completion.", + "x-ms-summary": "Sync mode" + } + ], + "responses": { + "200": { + "description": "Index rebuild started or completed successfully.", + "schema": { + "$ref": "#/definitions/StatusResponse" + } + }, + "403": { + "description": "Missing or invalid update token.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "422": { + "description": "Invalid input or parameters.", + "schema": { + "$ref": "#/definitions/HTTPValidationError" + } + } + }, + "x-ms-visibility": "important" + } + }, + "/entities/{entity_id}": { + "get": { + "summary": "Get entity by ID", + "x-ms-summary": "Retrieve a single entity by its unique identifier", + "description": "Returns the full record for an entity specified by its ID, including related data such as ownership, associations, and linked properties.\n", + "tags": [ + "Data access" + ], + "operationId": "Fetch_entity_entities__entity_id__get", + "deprecated": false, + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "entity_id", + "in": "path", + "required": true, + "type": "string", + "description": "Unique ID of the entity to retrieve.", + "x-ms-summary": "Entity ID" + }, + { + "name": "nested", + "in": "query", + "required": false, + "default": true, + "type": "boolean", + "description": "Include linked or related entities in the response.", + "x-ms-summary": "Include nested entities" + } + ], + "responses": { + "200": { + "description": "Entity retrieved successfully.", + "schema": { + "type": "object", + "additionalProperties": true, + "description": "Dynamic JSON object. Allows all field types without validation.\n" + }, + "examples": { + "application/json": "{\n \"id\": \"Q7747\",\n \"caption\": \"Vladimir Putin\",\n \"schema\": \"Person\",\n \"properties\": { \"name\": [\"Vladimir Putin\"] }\n}\n" + } + }, + "308": { + "description": "Entity was merged into another ID." + }, + "404": { + "description": "Entity not found or no longer exists.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "422": { + "description": "Invalid or malformed request parameters.", + "schema": { + "$ref": "#/definitions/HTTPValidationError" + } + }, + "500": { + "description": "Internal server error retrieving entity.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + }, + "x-ms-visibility": "important" + } + }, + "/entities/{entity_id}/adjacent": { + "get": { + "summary": "Get entities adjacent to an entity", + "x-ms-summary": "Retrieve related entities such as links, owners, or associates", + "description": "Returns entities connected to the specified entity, such as linked people, companies, identifiers, or sanctions. Useful for exploring graph relationships in the OpenSanctions dataset.\n", + "tags": [ + "Data access" + ], + "operationId": "Fetch_Adjacent_Entities__entities__entity_id__adjacent_get", + "deprecated": false, + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "entity_id", + "in": "path", + "required": true, + "type": "string", + "x-ms-visibility": "important", + "description": "Unique ID of the entity whose connections to retrieve.", + "x-ms-summary": "Entity ID" + }, + { + "name": "sort", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "x-ms-visibility": "advanced", + "description": "Sort results by field, e.g., score:desc.", + "x-ms-summary": "Sort order" + }, + { + "name": "limit", + "in": "query", + "required": false, + "default": 10, + "type": "integer", + "format": "int32", + "maximum": 500, + "description": "Maximum number of related entities to return (1�500).", + "x-ms-summary": "Result limit" + }, + { + "name": "offset", + "in": "query", + "required": false, + "default": 0, + "type": "integer", + "format": "int32", + "maximum": 9499, + "description": "Starting offset for paginated related entities.", + "x-ms-summary": "Result offset" + } + ], + "responses": { + "200": { + "description": "Related entities retrieved successfully.", + "schema": { + "type": "object", + "additionalProperties": true + } + }, + "308": { + "description": "Entity was merged into another ID." + }, + "404": { + "description": "Entity not found or unavailable.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "422": { + "description": "Invalid request or malformed parameters.", + "schema": { + "$ref": "#/definitions/HTTPValidationError" + } + }, + "500": { + "description": "Internal server error retrieving related entities.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/entities/{entity_id}/adjacent/{property_name}": { + "get": { + "summary": "Get related entities by property", + "x-ms-summary": "Retrieve adjacent entities linked by a specific property", + "description": "Returns entities related to a given entity through a specific property, such as ownership, family ties, or identifiers. Useful for exploring graph relationships in detail.\n", + "tags": [ + "Data access" + ], + "operationId": "Fetch_Adjacent_by_Property__entities__entity_id__adjacent__property_name__get", + "deprecated": false, + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "entity_id", + "in": "path", + "required": true, + "type": "string", + "x-ms-visibility": "important", + "description": "Unique ID of the entity whose related items to fetch.", + "x-ms-summary": "Entity ID" + }, + { + "name": "property_name", + "in": "path", + "required": true, + "type": "string", + "x-ms-visibility": "important", + "description": "Property name used to fetch related entities.", + "x-ms-summary": "Property name" + }, + { + "name": "sort", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "x-ms-visibility": "advanced", + "description": "Sort related entities by field, e.g., score:desc.", + "x-ms-summary": "Sort order" + }, + { + "name": "limit", + "in": "query", + "required": false, + "default": 10, + "type": "integer", + "format": "int32", + "maximum": 500, + "description": "Maximum number of related entities to return (1�500).", + "x-ms-summary": "Result limit" + }, + { + "name": "offset", + "in": "query", + "required": false, + "default": 0, + "type": "integer", + "format": "int32", + "maximum": 9499, + "description": "Starting offset for paginated related results.", + "x-ms-summary": "Result offset" + } + ], + "responses": { + "200": { + "description": "Related entities retrieved successfully.", + "schema": { + "type": "object", + "additionalProperties": true, + "description": "Dynamic JSON structure reprsenting related entities. Each property may contain arrays of strings or nested entity objects." + } + }, + "308": { + "description": "Entity was merged into another ID." + }, + "404": { + "description": "Entity or property not found.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "422": { + "description": "Invalid parameters or validation failure.", + "schema": { + "$ref": "#/definitions/HTTPValidationError" + } + }, + "500": { + "description": "Internal server error retrieving related entities.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/catalog": { + "get": { + "summary": "Get dataset catalog", + "x-ms-summary": "Retrieve the list of all indexed datasets", + "description": "Returns the full service catalog containing all available and indexed datasets in the OpenSanctions API. Useful for discovering dataset names and metadata.\n", + "tags": [ + "Data access" + ], + "operationId": "Catalog_catalog_get", + "deprecated": false, + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "Dataset catalog retrieved successfully.", + "schema": { + "type": "object", + "additionalProperties": true + } + } + }, + "x-ms-visibility": "important" + } + }, + "/statements": { + "get": { + "summary": "Get raw entity statements", + "x-ms-summary": "Retrieve raw data records from the statement model", + "description": "Returns granular entity data as individual statements from the OpenSanctions database. Each statement represents a single fact (e.g., name, address, birth date) extracted from source data.\n", + "tags": [ + "Data access" + ], + "operationId": "Statements_statements_get", + "deprecated": false, + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "dataset", + "in": "query", + "required": false, + "type": "string", + "x-ms-visibility": "important", + "description": "Limit results to statements from this dataset.", + "x-ms-summary": "Dataset name" + }, + { + "name": "entity_id", + "in": "query", + "required": false, + "type": "string", + "x-ms-visibility": "important", + "description": "Return statements linked to this entity ID.", + "x-ms-summary": "Entity ID" + }, + { + "name": "canonical_id", + "in": "query", + "required": false, + "type": "string", + "x-ms-visibility": "advanced", + "description": "Fetch statements for the canonical entity ID.", + "x-ms-summary": "Canonical ID" + }, + { + "name": "prop", + "in": "query", + "required": false, + "type": "string", + "x-ms-visibility": "advanced", + "description": "Filter statements by property name.", + "x-ms-summary": "Property filter" + }, + { + "name": "value", + "in": "query", + "required": false, + "type": "string", + "x-ms-visibility": "advanced", + "description": "Filter statements containing this property value.", + "x-ms-summary": "Property value" + }, + { + "name": "schema", + "in": "query", + "required": false, + "type": "string", + "x-ms-visibility": "advanced", + "description": "Restrict statements to entities of a given schema.", + "x-ms-summary": "Schema filter" + }, + { + "name": "sort", + "in": "query", + "required": false, + "default": [], + "type": "array", + "items": { + "type": "string" + }, + "x-ms-visibility": "advanced", + "description": "Sort results by field, e.g., timestamp:desc.", + "x-ms-summary": "Sort order" + }, + { + "name": "limit", + "in": "query", + "required": false, + "default": 50, + "type": "integer", + "format": "int32", + "maximum": 5000, + "description": "Maximum number of statements to return (1�5000).", + "x-ms-summary": "Result limit" + }, + { + "name": "offset", + "in": "query", + "required": false, + "default": 0, + "type": "integer", + "format": "int32", + "maximum": 9499, + "description": "Starting offset for paginated results.", + "x-ms-summary": "Result offset" + } + ], + "responses": { + "200": { + "description": "Statements retrieved successfully.", + "schema": { + "$ref": "#/definitions/StatementResponse" + } + }, + "422": { + "description": "Invalid request or validation failure.", + "schema": { + "$ref": "#/definitions/HTTPValidationError" + } + } + }, + "x-ms-visibility": "important" + } + }, + "/reconcile/{dataset}": { + "get": { + "summary": "Reconcile entities for a dataset", + "x-ms-summary": "Bulk match entities via OpenRefine-compatible API", + "description": "Provides a reconciliation endpoint compatible with the Google Refine (OpenRefine) API. Use this to bulk match or verify entity names against a dataset from an external tool such as OpenRefine.\n", + "tags": [ + "Reconciliation" + ], + "operationId": "Reconcile_reconcile__dataset__get", + "deprecated": false, + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "dataset", + "in": "path", + "required": true, + "type": "string", + "description": "Dataset or collection name to reconcile against.", + "x-ms-summary": "Target dataset", + "x-ms-visibility": "important" + } + ], + "responses": { + "200": { + "description": "Reconciliation metadata or match results returned.", + "schema": { + "$ref": "#/definitions/FreebaseManifest" + } + }, + "400": { + "description": "Invalid or malformed reconciliation query.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "422": { + "description": "Validation failed for one or more parameters.", + "schema": { + "$ref": "#/definitions/HTTPValidationError" + } + }, + "500": { + "description": "Internal server error during reconciliation.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + }, + "x-ms-visibility": "important" + } + } + }, + "definitions": { + "AdjacentResultsResponse": { + "title": "AdjacentResultsResponse", + "type": "object", + "properties": { + "limit": { + "example": 20, + "type": "integer", + "format": "int32" + }, + "offset": { + "example": 0, + "type": "integer", + "default": 0, + "format": "int32" + }, + "total": { + "$ref": "#/definitions/TotalSpec" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/Result" + } + } + }, + "required": [ + "limit", + "total" + ] + }, + "Algorithm": { + "title": "Algorithm", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the matching or scoring algorithm." + }, + "description": { + "type": "string", + "description": "Short description of what the algorithm does." + }, + "features": { + "type": "object", + "description": "Deprecated. Use the `docs` property instead.", + "additionalProperties": { + "$ref": "#/definitions/FeatureDoc" + } + }, + "docs": { + "$ref": "#/definitions/AlgorithmDocs" + } + }, + "required": [ + "name", + "features", + "docs" + ] + }, + "AlgorithmDocs": { + "title": "AlgorithmDocs", + "description": "Documentation for a scoring algorithm.", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": {}, + "config": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ConfigVar" + } + }, + "features": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/FeatureDoc" + } + } + }, + "required": [ + "name", + "config", + "features" + ] + }, + "AlgorithmResponse": { + "title": "AlgorithmResponse", + "type": "object", + "properties": { + "algorithms": { + "type": "array", + "items": { + "$ref": "#/definitions/Algorithm" + } + }, + "default": { + "type": "string" + }, + "best": { + "type": "string" + } + }, + "required": [ + "algorithms", + "default", + "best" + ] + }, + "ConfigVar": { + "title": "ConfigVar", + "description": "A configuration variable for a scoring algorithm.", + "type": "object", + "properties": { + "type": { + "$ref": "#/definitions/ConfigVarType" + }, + "description": { + "type": "string", + "description": "Explanation of what this configuration variable controls." + }, + "default": { + "type": "string", + "description": "Default value for this configuration variable, if any." + } + }, + "required": [ + "type" + ] + }, + "ConfigVarType": { + "title": "ConfigVarType", + "description": "The type of a configuration variable.", + "type": "string", + "enum": [ + "integer", + "float", + "boolean" + ] + }, + "DataCatalogModel": { + "title": "DataCatalogModel", + "type": "object", + "properties": { + "datasets": { + "type": "array", + "items": { + "$ref": "#/definitions/YenteDatasetModel" + } + }, + "current": { + "type": "array", + "items": { + "type": "string" + } + }, + "outdated": { + "type": "array", + "items": { + "type": "string" + } + }, + "index_stale": { + "type": "boolean", + "default": false + } + }, + "required": [ + "datasets", + "current", + "outdated" + ] + }, + "DataCoverage": { + "title": "DataCoverage", + "description": "Details on the temporal and geographic scope of a dataset.", + "type": "object", + "properties": { + "start": { + "type": "string", + "format": "date", + "description": "The start date of the dataset coverage period." + }, + "end": { + "type": "string", + "format": "date", + "description": "The end date of the dataset coverage period." + }, + "countries": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "description": "List of ISO country codes covered by the dataset." + }, + "frequency": { + "$ref": "#/definitions/Frequency" + }, + "schedule": { + "type": "string", + "description": "Optional schedule or cron expression for dataset updates." + } + }, + "required": [ + "countries" + ] + }, + "DataPublisher": { + "title": "DataPublisher", + "description": "Publisher information, eg. the government authority.", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "url": {}, + "name_en": {}, + "acronym": {}, + "description": {}, + "country": {}, + "official": {}, + "logo_url": {}, + "country_label": { + "readOnly": true + } + }, + "required": [ + "name" + ] + }, + "DataResource": { + "title": "DataResource", + "description": "A downloadable resource that is part of a dataset.", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "url": {}, + "checksum": {}, + "timestamp": {}, + "mime_type": {}, + "title": {}, + "size": {}, + "mime_type_label": { + "readOnly": true + } + }, + "required": [ + "name" + ] + }, + "EntityAdjacentResponse": { + "title": "EntityAdjacentResponse", + "type": "object", + "properties": { + "entity": { + "$ref": "#/definitions/EntityResponse" + }, + "adjacent": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/AdjacentResultsResponse" + } + } + }, + "required": [ + "entity", + "adjacent" + ] + }, + "EntityExample": { + "title": "EntityExample", + "type": "object", + "properties": { + "id": { + "example": "my-entity-id" + }, + "schema": { + "example": "Person", + "type": "string" + }, + "properties": { + "example": { + "name": [ + "John Doe" + ] + }, + "type": "object", + "additionalProperties": {} + } + }, + "required": [ + "schema", + "properties" + ] + }, + "EntityMatchQuery": { + "title": "EntityMatchQuery", + "type": "object", + "properties": { + "weights": { + "example": { + "name_literal": 0.8 + }, + "type": "object", + "default": {}, + "additionalProperties": { + "type": "number", + "format": "double" + } + }, + "config": { + "description": "Algorithm-specific configuration parameters.", + "example": { + "nm_number_mismatch": 0.4 + }, + "type": "object", + "additionalProperties": {} + }, + "queries": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/EntityExample" + } + } + }, + "required": [ + "queries" + ] + }, + "EntityMatchResponse": { + "title": "EntityMatchResponse", + "type": "object", + "properties": { + "responses": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/EntityMatches" + } + }, + "matcher": { + "description": "Information about the matcher that was used to score this request. Deprecated, use `/algorithms` endpoint instead.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/FeatureDoc" + } + }, + "limit": { + "example": 5, + "type": "integer", + "format": "int32" + } + }, + "required": [ + "responses", + "matcher", + "limit" + ] + }, + "EntityMatches": { + "title": "EntityMatches", + "type": "object", + "properties": { + "status": { + "example": 200, + "type": "integer", + "default": 200, + "format": "int32" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/ScoredEntityResponse" + } + }, + "total": { + "$ref": "#/definitions/TotalSpec" + }, + "query": { + "$ref": "#/definitions/EntityExample" + } + }, + "required": [ + "results", + "total", + "query" + ] + }, + "EntityResponse": { + "title": "EntityResponse", + "type": "object", + "properties": { + "id": { + "example": "NK-A7z....", + "type": "string" + }, + "caption": { + "example": "John Doe", + "type": "string" + }, + "schema": { + "example": "LegalEntity", + "type": "string" + }, + "properties": { + "example": { + "name": [ + "John Doe" + ] + }, + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "datasets": { + "example": [ + "us_ofac_sdn" + ], + "type": "array", + "default": [], + "items": { + "type": "string" + } + }, + "referents": { + "example": [ + "ofac-1234" + ], + "type": "array", + "default": [], + "items": { + "type": "string" + } + }, + "target": { + "type": "boolean", + "default": false + }, + "first_seen": { + "example": "2025-10-14T10:32:06.418Z" + }, + "last_seen": { + "example": "2025-10-14T10:32:06.418Z" + }, + "last_change": { + "example": "2025-10-14T10:32:06.418Z" + } + }, + "required": [ + "id", + "caption", + "schema", + "properties" + ] + }, + "ErrorResponse": { + "title": "ErrorResponse", + "type": "object", + "properties": { + "detail": { + "example": "Detailed error message", + "type": "string" + } + }, + "required": [ + "detail" + ] + }, + "Facet": { + "title": "Facet", + "type": "string", + "enum": [ + "datasets", + "schema", + "countries", + "identifiers", + "topics", + "genders" + ] + }, + "FeatureDoc": { + "title": "FeatureDoc", + "description": "Documentation for a particular feature in the matching API model.", + "type": "object", + "properties": { + "description": {}, + "coefficient": { + "type": "number", + "format": "double" + }, + "url": { + "type": "string" + } + }, + "required": [ + "description", + "coefficient", + "url" + ] + }, + "FreebaseManifest": { + "title": "FreebaseManifest", + "type": "object", + "properties": { + "versions": { + "example": [ + "0.2" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "example": "yente", + "type": "string" + }, + "identifierSpace": { + "type": "string", + "minLength": 1 + }, + "schemaSpace": { + "type": "string", + "minLength": 1 + }, + "documentation": { + "type": "string", + "minLength": 1 + }, + "batchSize": { + "type": "integer", + "format": "int32" + }, + "view": { + "$ref": "#/definitions/FreebaseManifestView" + }, + "preview": { + "$ref": "#/definitions/FreebaseManifestPreview" + }, + "suggest": { + "$ref": "#/definitions/FreebaseManifestSuggest" + }, + "extend": { + "$ref": "#/definitions/FreebaseManifestExtend" + }, + "defaultTypes": { + "type": "array", + "items": { + "$ref": "#/definitions/FreebaseType" + } + } + }, + "required": [ + "versions", + "name", + "identifierSpace", + "schemaSpace", + "documentation", + "batchSize", + "view", + "preview", + "suggest", + "extend", + "defaultTypes" + ] + }, + "FreebaseManifestExtend": { + "title": "FreebaseManifestExtend", + "type": "object", + "properties": { + "propose_properties": { + "$ref": "#/definitions/FreebaseManifestExtendProposeProperties" + }, + "propose_settings": { + "type": "array", + "items": { + "$ref": "#/definitions/FreebaseManifestExtendPropertySetting" + } + } + }, + "required": [ + "propose_properties", + "propose_settings" + ] + }, + "FreebaseManifestExtendPropertySetting": { + "title": "FreebaseManifestExtendPropertySetting", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "label": { + "type": "string" + }, + "type": { + "type": "string" + }, + "default": {}, + "help_text": { + "type": "string" + }, + "choices": { + "type": "array", + "items": { + "$ref": "#/definitions/FreebaseManifestExtendPropertySettingChoice" + } + } + }, + "required": [ + "name", + "label", + "type", + "default", + "help_text" + ] + }, + "FreebaseManifestExtendPropertySettingChoice": { + "title": "FreebaseManifestExtendPropertySettingChoice", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ] + }, + "FreebaseManifestExtendProposeProperties": { + "title": "FreebaseManifestExtendProposeProperties", + "type": "object", + "properties": { + "service_url": { + "type": "string", + "minLength": 1 + }, + "service_path": { + "type": "string" + } + }, + "required": [ + "service_url", + "service_path" + ] + }, + "FreebaseManifestPreview": { + "title": "FreebaseManifestPreview", + "type": "object", + "properties": { + "url": { + "type": "string" + }, + "width": { + "type": "integer", + "format": "int32" + }, + "height": { + "type": "integer", + "format": "int32" + } + }, + "required": [ + "url", + "width", + "height" + ] + }, + "FreebaseManifestSuggest": { + "title": "FreebaseManifestSuggest", + "type": "object", + "properties": { + "entity": { + "$ref": "#/definitions/FreebaseManifestSuggestType" + }, + "type": { + "$ref": "#/definitions/FreebaseManifestSuggestType" + }, + "property": { + "$ref": "#/definitions/FreebaseManifestSuggestType" + } + }, + "required": [ + "entity", + "type", + "property" + ] + }, + "FreebaseManifestSuggestType": { + "title": "FreebaseManifestSuggestType", + "type": "object", + "properties": { + "service_url": { + "type": "string", + "minLength": 1 + }, + "service_path": { + "type": "string" + } + }, + "required": [ + "service_url", + "service_path" + ] + }, + "FreebaseManifestView": { + "title": "FreebaseManifestView", + "type": "object", + "properties": { + "url": { + "type": "string" + } + }, + "required": [ + "url" + ] + }, + "FreebaseType": { + "title": "FreebaseType", + "type": "object", + "properties": { + "id": { + "example": "Person", + "type": "string" + }, + "name": { + "example": "People", + "type": "string" + }, + "description": {} + }, + "required": [ + "id", + "name" + ] + }, + "FtResult": { + "title": "FtResult", + "description": "A explained score for a particular feature result.", + "type": "object", + "properties": { + "detail": {}, + "score": { + "type": "number", + "format": "double" + } + }, + "required": [ + "detail", + "score" + ] + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "type": "array", + "items": { + "$ref": "#/definitions/ValidationError" + } + } + } + }, + "Operator": { + "title": "Operator", + "type": "string", + "enum": [ + "AND", + "OR" + ] + }, + "ScoredEntityResponse": { + "title": "ScoredEntityResponse", + "type": "object", + "properties": { + "id": { + "example": "NK-A7z....", + "type": "string" + }, + "caption": { + "example": "John Doe", + "type": "string" + }, + "schema": { + "example": "LegalEntity", + "type": "string" + }, + "properties": { + "example": { + "name": [ + "John Doe" + ] + }, + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "datasets": { + "example": [ + "us_ofac_sdn" + ], + "type": "array", + "default": [], + "items": { + "type": "string" + } + }, + "referents": { + "example": [ + "ofac-1234" + ], + "type": "array", + "default": [], + "items": { + "type": "string" + } + }, + "target": { + "type": "boolean", + "default": false + }, + "first_seen": { + "example": "2025-10-14T10:32:06.418Z" + }, + "last_seen": { + "example": "2025-10-14T10:32:06.418Z" + }, + "last_change": { + "example": "2025-10-14T10:32:06.418Z" + }, + "score": { + "type": "number", + "default": 0.99, + "format": "double" + }, + "features": { + "description": "A dictionary of subscores from features in the algorithm. Deprecated, use `explanations` instead.", + "type": "object", + "additionalProperties": { + "type": "number", + "format": "double" + } + }, + "explanations": { + "description": "A dictionary of subscores from features in the algorithm and explanations for how they were calculated.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/FtResult" + } + }, + "match": { + "description": "Whether the score is above the match threshold.", + "type": "boolean" + }, + "token": {} + }, + "required": [ + "id", + "caption", + "schema", + "properties", + "features", + "explanations", + "match" + ] + }, + "SearchFacet": { + "title": "SearchFacet", + "type": "object", + "properties": { + "label": { + "example": "Countries", + "type": "string" + }, + "values": { + "type": "array", + "items": { + "$ref": "#/definitions/SearchFacetItem" + } + } + }, + "required": [ + "label", + "values" + ] + }, + "SearchFacetItem": { + "title": "SearchFacetItem", + "type": "object", + "properties": { + "name": { + "example": "ru", + "type": "string" + }, + "label": { + "example": "Russia", + "type": "string" + }, + "count": { + "example": 42, + "type": "integer", + "default": 1, + "format": "int32" + } + }, + "required": [ + "name", + "label" + ] + }, + "SearchResponse": { + "title": "SearchResponse", + "type": "object", + "properties": { + "limit": { + "example": 20, + "type": "integer", + "format": "int32" + }, + "offset": { + "example": 0, + "type": "integer", + "default": 0, + "format": "int32" + }, + "total": { + "$ref": "#/definitions/TotalSpec" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/EntityResponse" + } + }, + "facets": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/SearchFacet" + } + } + }, + "required": [ + "limit", + "total", + "results", + "facets" + ] + }, + "Statement": { + "title": "Statement", + "type": "object", + "properties": { + "id": { + "example": "0000ad52d4d91a8...", + "type": "string" + }, + "entity_id": { + "example": "ofac-1234", + "type": "string" + }, + "canonical_id": { + "example": "NK-1234", + "type": "string" + }, + "prop": { + "example": "alias", + "type": "string" + }, + "prop_type": { + "example": "name", + "type": "string" + }, + "schema": { + "example": "LegalEntity", + "type": "string" + }, + "value": { + "example": "John Doe", + "type": "string" + }, + "original_value": { + "example": "John Doe (Esq.)" + }, + "dataset": { + "example": "us_ofac_sdn", + "type": "string" + }, + "lang": { + "example": "eng" + }, + "first_seen": { + "type": "string", + "format": "date-time" + }, + "last_seen": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "id", + "entity_id", + "canonical_id", + "prop", + "prop_type", + "schema", + "value", + "dataset", + "first_seen", + "last_seen" + ] + }, + "StatementResponse": { + "title": "StatementResponse", + "type": "object", + "properties": { + "limit": { + "example": 20, + "type": "integer", + "format": "int32" + }, + "offset": { + "example": 0, + "type": "integer", + "default": 0, + "format": "int32" + }, + "total": { + "$ref": "#/definitions/TotalSpec" + }, + "results": { + "type": "array", + "items": { + "$ref": "#/definitions/Statement" + } + } + }, + "required": [ + "limit", + "total", + "results" + ] + }, + "StatusResponse": { + "title": "StatusResponse", + "type": "object", + "properties": { + "status": { + "type": "string", + "default": "ok" + } + } + }, + "TotalSpec": { + "title": "TotalSpec", + "type": "object", + "properties": { + "value": { + "example": 42, + "type": "integer", + "format": "int32" + }, + "relation": { + "example": "eq", + "type": "string", + "default": "eq" + } + }, + "required": [ + "value" + ] + }, + "ValidationError": { + "title": "ValidationError", + "type": "object", + "properties": { + "loc": { + "type": "array", + "items": {} + }, + "msg": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "loc", + "msg", + "type" + ] + }, + "YenteDatasetModel": { + "title": "YenteDatasetModel", + "description": "Represents a dataset within OpenSanctions, including its metadata, coverage, resources, and related datasets.\n", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Unique dataset identifier." + }, + "title": { + "type": "string", + "description": "Human-readable dataset title." + }, + "license": { + "type": "string", + "description": "License under which the dataset is published." + }, + "summary": { + "type": "string", + "description": "Short summary of the dataset." + }, + "description": { + "type": "string", + "description": "Detailed dataset description." + }, + "url": { + "type": "string", + "description": "Web URL for dataset documentation." + }, + "updated_at": { + "type": "string", + "format": "date-time", + "description": "Timestamp of the last dataset update." + }, + "last_export": { + "type": "string", + "format": "date-time", + "description": "Timestamp of the last export." + }, + "entity_count": { + "type": "integer", + "format": "int32", + "description": "Total number of entities included in the dataset." + }, + "thing_count": { + "type": "integer", + "format": "int32", + "description": "Total number of non-entity objects in the dataset." + }, + "version": { + "type": "string", + "description": "Dataset version identifier." + }, + "category": { + "type": "string", + "description": "Category of dataset (e.g., sanctions, PEPs)." + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "description": "Keywords or topics associated with the dataset." + }, + "publisher": { + "$ref": "#/definitions/Publisher" + }, + "coverage": { + "$ref": "#/definitions/Coverage" + }, + "resources": { + "type": "array", + "items": { + "$ref": "#/definitions/DataResource" + }, + "description": "List of resources included in the dataset." + }, + "children": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "description": "Child datasets derived from this dataset." + }, + "load": { + "type": "string", + "description": "Optional data loading information." + }, + "entities_url": { + "type": "string", + "description": "API URL for accessing entity data." + }, + "delta_url": { + "type": "string", + "description": "API URL for accessing delta (update) data." + }, + "namespace": { + "type": "boolean", + "default": false, + "description": "Indicates if the dataset defines its own namespace." + }, + "index_version": { + "type": "string", + "description": "Index version number." + }, + "index_current": { + "type": "boolean", + "readOnly": true, + "description": "Whether the index is current." + } + }, + "required": [ + "name", + "title" + ] + }, + "Coverage": { + "title": "Coverage", + "description": "Describes the temporal, geographic, and update coverage of a dataset.\n", + "type": "object", + "properties": { + "start": { + "type": "string", + "format": "date", + "description": "The start date of the dataset coverage period." + }, + "end": { + "type": "string", + "format": "date", + "description": "The end date of the dataset coverage period." + }, + "countries": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "description": "List of ISO country codes covered by the dataset." + }, + "frequency": { + "$ref": "#/definitions/Frequency" + }, + "schedule": { + "type": "string", + "description": "Optional schedule or cron expression for dataset updates." + } + }, + "required": [ + "countries" + ] + }, + "Frequency": { + "title": "Frequency", + "type": "string", + "enum": [ + "unknown", + "never", + "hourly", + "daily", + "weekly", + "monthly", + "annually" + ] + }, + "Operator1": { + "title": "Operator1", + "description": "Logic to use when combining multiple filters on the same field (topics, countries, datasets). Please specify AND for new integrations (to override a legacy default) and when building a faceted user interface.", + "type": "string", + "enum": [ + "AND", + "OR" + ] + }, + "Property": { + "title": "Property", + "type": "object", + "properties": { + "id": { + "example": "NK-A7z....", + "type": "string" + }, + "caption": { + "example": "John Doe", + "type": "string" + }, + "schema": { + "example": "LegalEntity", + "type": "string" + }, + "properties": { + "example": { + "name": [ + "John Doe" + ] + }, + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "datasets": { + "example": [ + "us_ofac_sdn" + ], + "type": "array", + "default": [], + "items": { + "type": "string" + } + }, + "referents": { + "example": [ + "ofac-1234" + ], + "type": "array", + "default": [], + "items": { + "type": "string" + } + }, + "target": { + "type": "boolean", + "default": false + }, + "first_seen": { + "example": "2025-10-14T10:32:06.418Z" + }, + "last_seen": { + "example": "2025-10-14T10:32:06.418Z" + }, + "last_change": { + "example": "2025-10-14T10:32:06.418Z" + } + } + }, + "Publisher": { + "title": "Publisher", + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "url": {}, + "name_en": {}, + "acronym": {}, + "description": {}, + "country": {}, + "official": {}, + "logo_url": {}, + "country_label": { + "readOnly": true + } + } + }, + "Result": { + "title": "Result", + "type": "object", + "properties": { + "id": { + "example": "NK-A7z....", + "type": "string" + }, + "caption": { + "example": "John Doe", + "type": "string" + }, + "schema": { + "example": "LegalEntity", + "type": "string" + }, + "properties": { + "example": { + "name": [ + "John Doe" + ] + }, + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "datasets": { + "example": [ + "us_ofac_sdn" + ], + "type": "array", + "default": [], + "items": { + "type": "string" + } + }, + "referents": { + "example": [ + "ofac-1234" + ], + "type": "array", + "default": [], + "items": { + "type": "string" + } + }, + "target": { + "type": "boolean", + "default": false + }, + "first_seen": { + "example": "2025-10-14T10:32:06.418Z" + }, + "last_seen": { + "example": "2025-10-14T10:32:06.418Z" + }, + "last_change": { + "example": "2025-10-14T10:32:06.418Z" + } + } + } + }, + "tags": [ + { + "name": "Matching", + "description": "Endpoints for conducting a user-facing entity search or matching a local data store against the given dataset.", + "externalDocs": { + "url": "https://opensanctions.org/reference/", + "description": "Data dictionary" + } + }, + { + "name": "System information", + "description": "Service metadata endpoints for health checking and getting the application metadata to be used in client applications." + }, + { + "name": "Data access", + "description": "Endpoints for fetching data from the API, either related to individual entities, or for bulk data access in various forms.", + "externalDocs": { + "url": "https://opensanctions.org/reference/", + "description": "Data dictionary" + } + }, + { + "name": "Reconciliation", + "description": "The Reconciliation Service provides four separate endpoints that work in concert to implement the data matching API used by OpenRefine, Wikidata and several other services and utilities.", + "externalDocs": { + "url": "https://reconciliation-api.github.io/specs/latest/", + "description": "W3C Community API specification" + } + } + ], + "security": [ + { + "api_key": [] + } + ] +} \ No newline at end of file diff --git a/independent-publisher-connectors/OpenSanctions/apiSettings.json b/independent-publisher-connectors/OpenSanctions/apiSettings.json new file mode 100644 index 0000000000..dd30520903 --- /dev/null +++ b/independent-publisher-connectors/OpenSanctions/apiSettings.json @@ -0,0 +1,24 @@ +{ + "properties": { + "connectionParameters": { + + "api_key": { + "type": "securestring", + "uiDefinition": { + "displayName": "API Key", + "description": "The API key", + "tooltip": "Provide your API Key", + "constraints": { + "tabIndex": 2, + "clearText": false, + "required": "true" + } + } + } + }, + "iconBrandColor": "#da3b01", + "capabilities": [], + "publisher": "Dan Romano", + "stackOwner": "OpenSanctions Datenbanken GmbH" + } +} \ No newline at end of file diff --git a/independent-publisher-connectors/OpenSanctions/readme.md b/independent-publisher-connectors/OpenSanctions/readme.md new file mode 100644 index 0000000000..8959622a24 --- /dev/null +++ b/independent-publisher-connectors/OpenSanctions/readme.md @@ -0,0 +1,75 @@ +# OpenSanctions + +## Overview + +The OpenSanctions API provides access to a global database of persons and companies of political, criminal, or economic interest. It aggregates data from hundreds of sanctions lists, politically exposed persons (PEPs), +and watchlists across the world. + +You can use this connector to match, search, and fetch entities, explore relationships, and analyze dataset coverage. + +Learn more at [OpenSanctions.org](https://www.opensanctions.org/). + +## Publisher - Dan Romano (swolcat) + +## Prerequisites + +You will need an API key from OpenSanctions to use this connector. Register for a free key at: +[https://www.opensanctions.org/api/](https://www.opensanctions.org/api/) + +## Supported Operations +### Match entities by dataset + +Match entities based on name and optional fields such as birth date, nationality, and identifiers. This endpoint supports fuzzy matching. + +### Search entities in a dataset + +Search entities using a simple text query. Supports filters, topics, countries, and datasets for refined searches. + +### Get entity by ID + +Retrieve a single entity record by its unique identifier, including nested and related attributes. + +### Get adjacent entities + +Return entities adjacent to a specified entity (e.g., associates, family members, or related companies). + +### Get adjacent entities by property + +Return related entities for a specific property (e.g., familyPerson, ownershipOwner, membershipMember). + +### Get dataset catalog + +Retrieve the list of all indexed datasets available via OpenSanctions. + +### Get system health + +Perform a system health check to verify service availability. + +### Get matching algorithms + +List supported entity-matching algorithms used by the system. + +### Force index update + +Trigger a re-indexing operation if authorized with a valid update token. + +## Getting Started + +1. Create an account at [OpenSanctions.org](https://www.opensanctions.org/). +2. An API key +3. In Power Automate or Power Apps, create a new connection using your API key. +4. Use the connector’s actions to search, match, or fetch entities. + +## Obtaining Credentials + +Visit [https://www.opensanctions.org/api/](https://www.opensanctions.org/api/) to request an API key. You’ll receive an `ApiKey` value that should be used in the `Authorization` header: + +Authorization: ApiKey YOUR_API_KEY + +## Known Issues and Limitations + +- Response structures are dynamic; use "Parse JSON" in Power Automate to access nested values. +- The `search` and `match` endpoints may return large responses depending on the dataset scope. +- Some endpoints require a valid `dataset` parameter (e.g., `sanctions`). +- Sorting by unsupported fields (like `score`) may trigger errors. +- API rate limits may apply depending on your plan. \ No newline at end of file From 28d21f15ced2af6c03e6c175c4d2bed49f62f707 Mon Sep 17 00:00:00 2001 From: Dan Romano <1087791+krautrocker@users.noreply.github.com> Date: Mon, 17 Nov 2025 09:01:28 -0500 Subject: [PATCH 2/2] - Connector certification package - paconn validated, no errors. --- .../ConnectorCertificationPackage.zip | Bin 0 -> 31272 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 independent-publisher-connectors/OpenSanctions/ConnectorCertificationPackage.zip diff --git a/independent-publisher-connectors/OpenSanctions/ConnectorCertificationPackage.zip b/independent-publisher-connectors/OpenSanctions/ConnectorCertificationPackage.zip new file mode 100644 index 0000000000000000000000000000000000000000..ed6e125cb5aec0c894eed3b6a247facf10317a35 GIT binary patch literal 31272 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