{
  "openapi": "3.0.1",
  "info": {
    "title": "Identity Verification API - KYC, Fraud and Risk Scores",
    "description": "Verify a person and score them for fraud in one call: KYC name, address, date of birth and national ID matching, synthetic identity detection, separate email, phone and address risk scores, name correlation checks, reason codes, and an accept, review or reject decision. Pay per result.",
    "version": "0.1",
    "x-build-id": "FFXMcxIObuFoF1ulA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nabeelbaghoor~identity-verification-kyc-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nabeelbaghoor-identity-verification-kyc-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/nabeelbaghoor~identity-verification-kyc-api/runs": {
      "post": {
        "operationId": "runs-sync-nabeelbaghoor-identity-verification-kyc-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/nabeelbaghoor~identity-verification-kyc-api/run-sync": {
      "post": {
        "operationId": "run-sync-nabeelbaghoor-identity-verification-kyc-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "identities": {
            "title": "Identities to verify",
            "type": "array",
            "description": "The people to evaluate, as a JSON array of objects. Each object can carry any of: firstName, surName, middleName, email, mobileNumber, physicalAddress, physicalAddress2, city, state, zip, country, dob, nationalId, userConsent, consentTimestamp, customerUserId, ipAddress. Fill in whatever you hold; which fields a given module needs depends on what your account is licensed for. A bare string is read as an email address if it contains an at sign and as a phone number otherwise, so a plain contact list works without writing JSON."
          },
          "platform": {
            "title": "Which API generation to call",
            "enum": [
              "modules",
              "workflow"
            ],
            "type": "string",
            "description": "This provider runs two API generations side by side and they are not variants of one another: different hosts, different credential schemes and different request shapes. The modules endpoint takes an explicit list of what to evaluate and is the one to use unless you know otherwise. The workflow endpoint runs a workflow you configured in the provider dashboard, so what gets evaluated is decided there rather than here. Your key works on one generation, not both.",
            "default": "modules"
          },
          "environment": {
            "title": "Environment",
            "enum": [
              "production",
              "sandbox"
            ],
            "type": "string",
            "description": "Production or sandbox. The sandbox is a separate host rather than a flag, and sandbox credentials are refused by production with the same message a wrong key gets, so this has to match the key you are using.",
            "default": "production"
          },
          "modules": {
            "title": "Modules to evaluate",
            "type": "array",
            "description": "On the modules endpoint, which checks to run. Each one is licensed and billed separately by the provider, and a module your account does not hold comes back empty rather than as an error, so its columns will simply be blank. Pick only what you actually need: every extra module costs money on every identity.",
            "items": {
              "type": "string",
              "enum": [
                "kyc",
                "fraud",
                "synthetic",
                "emailrisk",
                "phonerisk",
                "addressrisk",
                "decision"
              ],
              "enumTitles": [
                "KYC: does this name, address, date of birth and national ID belong together",
                "Fraud: an overall identity fraud score with reason codes",
                "Synthetic: is this a fabricated identity stitched from real pieces",
                "Email risk: how risky is the email address and does it fit the identity",
                "Phone risk: how risky is the number and does it fit the identity",
                "Address risk: how risky is the address and does the person live there",
                "Decision: apply your account's own rules and return accept, review or reject"
              ]
            },
            "default": [
              "emailrisk"
            ]
          },
          "extraModules": {
            "title": "Additional modules",
            "type": "array",
            "description": "Any other module names your account is licensed for, written exactly as the provider names them. This provider adds modules between releases and licenses them per account, so rather than guess at a complete list, the common ones are ticked above and anything else goes here. Names written here are sent whether or not they appear in the list above.",
            "items": {
              "type": "string"
            }
          },
          "workflow": {
            "title": "Workflow name",
            "type": "string",
            "description": "On the workflow endpoint, the identifier of the workflow to run. You will find it in your provider dashboard under the developer workbench. It must name a single active workflow in the environment you selected. Ignored on the modules endpoint."
          },
          "decisions": {
            "title": "Keep only these decisions",
            "type": "array",
            "description": "Only keep rows whose decision matches one of these. This is the fastest way to turn a verification run into a queue: keep the reviews to work through by hand, or keep the rejects to act on. Matching ignores capitalisation. Leave empty to keep every decision.",
            "items": {
              "type": "string",
              "enum": [
                "accept",
                "review",
                "reject",
                "refer",
                "resubmit"
              ],
              "enumTitles": [
                "Accept: proceed",
                "Review: send to manual review",
                "Reject: refuse",
                "Refer: refer for further checks",
                "Resubmit: ask for the details again"
              ]
            },
            "default": []
          },
          "minFraudScore": {
            "title": "Minimum fraud score",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "Only keep rows scoring at or above this. This provider reports its scores on a zero to one scale where higher is riskier, so a threshold like 0.7 keeps only the genuinely suspicious. Leave at zero to keep every score.",
            "default": 0
          },
          "maxFraudScore": {
            "title": "Maximum fraud score",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "Only keep rows scoring at or below this on the zero to one scale. The one to use when you are building a clean list rather than a review queue. Leave at zero to keep every score.",
            "default": 0
          },
          "maxEmailRiskScore": {
            "title": "Maximum email risk score",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "Only keep rows whose email risk score is at or below this, on the zero to one scale. Leave at zero to skip this check.",
            "default": 0
          },
          "maxPhoneRiskScore": {
            "title": "Maximum phone risk score",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "Only keep rows whose phone risk score is at or below this, on the zero to one scale. Leave at zero to skip this check.",
            "default": 0
          },
          "maxAddressRiskScore": {
            "title": "Maximum address risk score",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "Only keep rows whose address risk score is at or below this, on the zero to one scale. Leave at zero to skip this check.",
            "default": 0
          },
          "excludeReasonCodes": {
            "title": "Drop rows carrying these reason codes",
            "type": "array",
            "description": "Drop any row whose pooled reason codes include one of these, written as the provider's codes such as I553. Reason codes are the specific findings behind a score, so this is the finer instrument when a score threshold is too blunt. Matching ignores capitalisation. Leave empty to skip this check.",
            "items": {
              "type": "string"
            }
          },
          "requireReasonCodes": {
            "title": "Keep only rows carrying these reason codes",
            "type": "array",
            "description": "Keep only rows whose pooled reason codes include at least one of these. Useful for isolating a single finding across a large run. Matching ignores capitalisation. Leave empty to skip this check.",
            "items": {
              "type": "string"
            }
          },
          "requestsPerMinute": {
            "title": "Requests per minute",
            "minimum": 1,
            "maximum": 3000,
            "type": "integer",
            "description": "Pace the run so it stays under whatever rate your contract allows. Lower this if the provider starts rate limiting; raise it to finish a long list sooner.",
            "default": 120
          },
          "skipNotFound": {
            "title": "Skip identities with no result",
            "type": "boolean",
            "description": "Leave identities the provider returned nothing for, and entries refused before they were sent, out of the dataset. Off by default, because knowing which of your records were unusable is usually the point. Misses are never charged for either way.",
            "default": false
          },
          "maxResults": {
            "title": "Maximum results",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop after this many rows. This is the cap on both spend and run time.",
            "default": 100
          },
          "apiKey": {
            "title": "API key",
            "type": "string",
            "description": "Your own API key for the identity verification API, taken from your provider dashboard. Keys are issued per environment and per API generation, so make sure the environment and generation above match the key you are pasting in. Stored as a secret."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}