{
  "openapi": "3.0.1",
  "info": {
    "title": "GitHub Scraper: Archived, Moved & Relicensed Repos",
    "description": "Checks GitHub repositories against what the package registry claims. Catches what a registry never reports: a package served with no deprecation notice whose repository is archived, a repository that moved owner while requests keep returning 200, and a licence that changed after you installed it.",
    "version": "0.1",
    "x-build-id": "AhZvisnvQVUvY6W0S"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/aiqlabs~github-repository-audit/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-aiqlabs-github-repository-audit",
        "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/aiqlabs~github-repository-audit/runs": {
      "post": {
        "operationId": "runs-sync-aiqlabs-github-repository-audit",
        "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/aiqlabs~github-repository-audit/run-sync": {
      "post": {
        "operationId": "run-sync-aiqlabs-github-repository-audit",
        "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": {
          "repos": {
            "title": "Repositories",
            "type": "array",
            "description": "GitHub repositories to audit. Any of these forms work: owner/name, https://github.com/owner/name, git+ssh://git@github.com/owner/name.git, github:owner/name. Every output row carries a \"source\" field naming which input it came from, so rows from this list read as source=repos. Nothing is audited that you did not name here, in Packages, or in a manifest. A repository on its own has no registry side, so registryDeprecated, licenseMatch and silentAbandonment come back null on these rows because they could not be checked, not because they came back clean. Give the package name in Packages instead if you need those three.",
            "items": {
              "type": "string"
            }
          },
          "packages": {
            "title": "Packages",
            "type": "array",
            "description": "Package names to audit. Prefix with the registry - npm:express, pypi:requests - or leave the prefix off and set the default registry below. Each package is read from its registry, then checked against the repository it points at. Every output row carries a \"source\" field naming which input it came from, so rows from this list read as source=packages.",
            "items": {
              "type": "string"
            }
          },
          "defaultRegistry": {
            "title": "Default registry",
            "enum": [
              "npm",
              "pypi"
            ],
            "type": "string",
            "description": "Which registry to assume for package names given without a prefix.",
            "default": "npm"
          },
          "manifestUrl": {
            "title": "Manifest URL",
            "type": "string",
            "description": "A raw package.json, requirements.txt or go.mod to read the dependency list from. Use the raw file URL, not the GitHub page."
          },
          "manifestText": {
            "title": "Manifest contents",
            "type": "string",
            "description": "Paste a package.json, requirements.txt or go.mod here instead of hosting it somewhere. Takes precedence over the manifest URL."
          },
          "manifestType": {
            "title": "Manifest type",
            "enum": [
              "",
              "package.json",
              "requirements.txt",
              "go.mod"
            ],
            "type": "string",
            "description": "Leave empty to detect it from the file name and contents. pyproject.toml and lockfiles are not supported - they need a real parser, and half-parsing a manifest produces findings about dependencies you do not have.",
            "default": ""
          },
          "manifestGroups": {
            "title": "package.json blocks to read",
            "type": "array",
            "description": "Which dependency blocks to take from a package.json.",
            "items": {
              "type": "string",
              "enum": [
                "dependencies",
                "devDependencies",
                "peerDependencies",
                "optionalDependencies"
              ],
              "enumTitles": [
                "dependencies",
                "devDependencies",
                "peerDependencies",
                "optionalDependencies"
              ]
            },
            "default": [
              "dependencies"
            ]
          },
          "githubToken": {
            "title": "GitHub token (optional)",
            "type": "string",
            "description": "Without a token GitHub allows 60 requests an hour per IP address, and on shared infrastructure that allowance is shared with other tenants. Any personal access token with no scopes raises it to 5,000 an hour. The token is only sent to api.github.com."
          },
          "staleAfterDays": {
            "title": "Call a repository stale after (days)",
            "minimum": 30,
            "maximum": 3650,
            "type": "integer",
            "description": "How long without a pushed commit before a repository is reported as stale. This is a judgement call, so it is reported at medium severity and never used for the archived-but-not-deprecated finding, which relies only on the maintainer's own archive flag.",
            "default": 365
          },
          "includeContributors": {
            "title": "Check contributor concentration",
            "type": "boolean",
            "description": "Adds one GitHub request per repository and reports what share of commits the single busiest contributor accounts for.",
            "default": false
          },
          "includeReleases": {
            "title": "Check the last published release",
            "type": "boolean",
            "description": "Adds one GitHub request per repository and reports the newest tagged release, which is often years behind the newest commit.",
            "default": false
          },
          "onlyIssues": {
            "title": "Only output rows with findings",
            "type": "boolean",
            "description": "Leaves out the dependencies that came back clean.",
            "default": false
          },
          "maxTargets": {
            "title": "Maximum entries to audit",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "A ceiling on how many packages or repositories one run will look at.",
            "default": 200
          },
          "maxConcurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Kept low on purpose. Running wider does not buy extra GitHub allowance, and these are other people's servers.",
            "default": 4
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "How long to wait for any single API response before giving up on it.",
            "default": 30
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}