{
  "openapi": "3.0.1",
  "info": {
    "title": "South Africa Tenders Scraper: eTenders Feed",
    "description": "Returns open South African government tenders from eTenders: tender number, buyer, province, category, closing date and time, briefing sessions and document links. Filter by province, buyer, category or keyword. Daily mode returns only new tenders.",
    "version": "1.0",
    "x-build-id": "XVyxpycYWfIL3w5hf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/agents001~sa-tenders-feed/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-agents001-sa-tenders-feed",
        "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/agents001~sa-tenders-feed/runs": {
      "post": {
        "operationId": "runs-sync-agents001-sa-tenders-feed",
        "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/agents001~sa-tenders-feed/run-sync": {
      "post": {
        "operationId": "run-sync-agents001-sa-tenders-feed",
        "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": {
          "publishedWithinDays": {
            "title": "Published in the last N days",
            "minimum": 1,
            "maximum": 366,
            "type": "integer",
            "description": "Return tenders published from this many days ago up to today (South African time). Ignored when 'Published from' is set.",
            "default": 3
          },
          "publishedFrom": {
            "title": "Published from (optional)",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$|^(\\d+)\\s*(day|week|month|year)s?$",
            "type": "string",
            "description": "Start of the publication window. Use a date (2026-10-01) or a relative value (\"2 weeks\" means two weeks ago). Overrides 'Published in the last N days'."
          },
          "publishedTo": {
            "title": "Published to (optional)",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "type": "string",
            "description": "End of the publication window (inclusive). Defaults to today."
          },
          "closingDateFrom": {
            "title": "Closing on or after (optional)",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$|^(\\d+)\\s*(day|week|month|year)s?$",
            "type": "string",
            "description": "Only tenders closing on or after this date. A relative value like \"7 days\" means seven days from today. Useful to skip tenders you cannot respond to in time."
          },
          "closingDateTo": {
            "title": "Closing on or before (optional)",
            "pattern": "^(\\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$|^(\\d+)\\s*(day|week|month|year)s?$",
            "type": "string",
            "description": "Only tenders closing on or before this date. A relative value like \"30 days\" means thirty days from today."
          },
          "status": {
            "title": "Status",
            "enum": [
              "open",
              "closed",
              "cancelled",
              "awarded",
              "all"
            ],
            "type": "string",
            "description": "Tender status. 'Open' means published and not yet closed. 'All' also includes draft notices that appear in the OCDS data before going live.",
            "default": "open"
          },
          "provinces": {
            "title": "Provinces",
            "type": "array",
            "description": "Only tenders for these provinces. Leave empty for all. 'National' covers national departments and state-owned companies.",
            "items": {
              "type": "string",
              "enum": [
                "Eastern Cape",
                "Free State",
                "Gauteng",
                "KwaZulu-Natal",
                "Limpopo",
                "Mpumalanga",
                "North West",
                "Northern Cape",
                "Western Cape",
                "National"
              ]
            }
          },
          "organsOfState": {
            "title": "Organ of state / department contains",
            "type": "array",
            "description": "Only tenders whose buyer name contains any of these words, for example \"Transnet\", \"Eskom\", \"City of Cape Town\" or \"Health\". Case-insensitive.",
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Category contains",
            "type": "array",
            "description": "Only tenders whose eTenders category (or OCDS goods/services/works class) contains any of these words, for example \"Construction\", \"Security\", \"Supplies: Computer Equipment\" or \"works\".",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Only tenders whose title, description or tender number contains any of these words or phrases, for example \"solar\", \"cleaning services\". Case-insensitive.",
            "items": {
              "type": "string"
            }
          },
          "maxItems": {
            "title": "Maximum tenders",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many tenders (newest first). Set 0 for no limit. You pay per tender returned.",
            "default": 50
          },
          "includeContactPersons": {
            "title": "Include official contact email",
            "type": "boolean",
            "description": "Add the official contact email published on the notice. For POPIA data minimisation, contact names, phone numbers and free webmail addresses are never included.",
            "default": false
          },
          "onlyNew": {
            "title": "Only new since last run",
            "type": "boolean",
            "description": "For scheduled monitoring. When on, the Actor remembers which tenders (by OCDS id) it has already delivered for this combination of filters and returns only tenders it has not delivered before. You pay only for the new tenders that are saved. State is kept in a named key-value store in your account, named from a hash of your filters (status, provinces, organs of state, categories, keywords, sources). Publication and closing date windows and Maximum tenders are not part of it, so a rolling window keeps the same state. The last 50,000 tender IDs are remembered.",
            "default": false
          },
          "stateStoreName": {
            "title": "State store name (optional)",
            "type": "string",
            "description": "Only used with 'Only new since last run'. Override the automatic name of the key-value store that remembers delivered tenders, for example to share state between schedules or to start fresh with a new name. Lowercase letters, numbers and hyphens, up to 63 characters. Leave empty for the automatic name."
          },
          "sources": {
            "title": "Sources",
            "type": "array",
            "description": "Which tender sources to read. Currently only the national eTenders portal.",
            "items": {
              "type": "string",
              "enum": [
                "etenders"
              ],
              "enumTitles": [
                "National eTenders portal (OCDS API)"
              ]
            },
            "default": [
              "etenders"
            ]
          },
          "requestDelaySecs": {
            "title": "Delay between requests",
            "minimum": 0.2,
            "maximum": 10,
            "type": "number",
            "description": "Minimum seconds between requests to the same server. Keep this polite: the portal is a public government service.",
            "default": 0.5
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}