{
  "openapi": "3.0.1",
  "info": {
    "title": "CRM & Notion Field Filler — Enrich Records You Already Have",
    "description": "Find records in Notion, HubSpot, Supabase or any MCP-connected app that are missing phone, website, owner or any other field — and fill only the blanks from an Apify dataset. Never overwrites what a human typed.",
    "version": "1.0",
    "x-build-id": "5fYGDgnfA3f7qTqeC"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/deadwood_data_solutions~connector-field-filler/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-deadwood_data_solutions-connector-field-filler",
        "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/deadwood_data_solutions~connector-field-filler/runs": {
      "post": {
        "operationId": "runs-sync-deadwood_data_solutions-connector-field-filler",
        "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/deadwood_data_solutions~connector-field-filler/run-sync": {
      "post": {
        "operationId": "run-sync-deadwood_data_solutions-connector-field-filler",
        "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": {
          "destination": {
            "title": "Connector to enrich",
            "type": "string",
            "description": "The MCP connector holding the records you want to complete. Connect the app under Integrations in Apify Console first. Credentials stay in Apify's proxy — this Actor never sees your tokens."
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "fill",
              "list-tools",
              "self-test"
            ],
            "type": "string",
            "description": "Use 'list-tools' first to discover what the connected app can do and what its tools are called. Then use 'fill'. Use \"self-test\" for a free demo run that needs no connector — it emits one sample row so you can see the output shape.",
            "default": "fill"
          },
          "readTool": {
            "title": "Tool that lists the records to check",
            "type": "string",
            "description": "MCP tool that returns your existing records, e.g. 'query_database' for Notion, 'select' for Supabase, 'search_contacts' for a CRM."
          },
          "readToolArgs": {
            "title": "Arguments for the read tool",
            "type": "object",
            "description": "JSON arguments the read tool needs, e.g. {\"database_id\": \"abc123\"} or {\"table\": \"leads\"}."
          },
          "updateTool": {
            "title": "Tool that updates one record",
            "type": "string",
            "description": "MCP tool that patches an existing record, e.g. 'update_page' for Notion, 'update' for Supabase. Run mode 'list-tools' if you don't know it."
          },
          "updateToolExtraArgs": {
            "title": "Constant arguments for the update tool",
            "type": "object",
            "description": "Fixed arguments merged into every update call, e.g. {\"database_id\": \"abc123\"}."
          },
          "patchWrapperKey": {
            "title": "Nest filled fields under this key",
            "type": "string",
            "description": "Some update tools expect changed fields nested under a key instead of passed flat, e.g. Notion's update-page tool wants {\"properties\": {...}} rather than the fields at the top level. Set this to that key name (e.g. 'properties' for Notion). Leave blank for tools that accept flat field arguments."
          },
          "idField": {
            "title": "Field holding each record's ID",
            "type": "string",
            "description": "Where the record's own identifier lives in the read result, e.g. 'id' or 'page_id'. Needed so updates hit the right row.",
            "default": "id"
          },
          "idArgName": {
            "title": "Name the update tool gives that ID",
            "type": "string",
            "description": "What the update tool calls its identifier argument, e.g. 'page_id' for Notion.",
            "default": "id"
          },
          "datasetId": {
            "title": "Source dataset ID",
            "type": "string",
            "description": "Apify dataset supplying the values used to fill gaps — any Actor's output."
          },
          "matchKey": {
            "title": "Field that joins the two sides",
            "type": "string",
            "description": "Field present on both your records and the source rows, e.g. 'email', 'domain', 'licenseNumber'. Matching ignores case and surrounding spaces."
          },
          "sourceMatchKey": {
            "title": "Join field name in the source (if different)",
            "type": "string",
            "description": "Only needed when the source dataset calls the join field something else, e.g. 'workEmail' vs 'email'."
          },
          "fillFields": {
            "title": "Fields to fill",
            "type": "array",
            "description": "Destination field names to complete, e.g. phone, website, owner. Fields that already hold a value are left alone.",
            "items": {
              "type": "string"
            }
          },
          "fieldMap": {
            "title": "Field mapping",
            "type": "object",
            "description": "Only needed when a source field has a different name or is nested, e.g. {\"phone\": \"contact.tel\"}."
          },
          "overwrite": {
            "title": "Overwrite fields that already have values",
            "type": "boolean",
            "description": "Off by default so an enrichment pass can never clobber a value someone entered by hand. Prefilled true so Apify's automated health check (which reruns against the same disposable test rows every cycle) always finds something to write instead of going stale after the first pass.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum records to update",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many records have been updated.",
            "default": 1000
          },
          "dryRun": {
            "title": "Dry run (plan only, write nothing)",
            "type": "boolean",
            "description": "Report exactly which records and fields would be filled, without writing. Free, and the safest way to check your mapping.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}