# Public API Reproducibility Snapshotter (`flintglade/public-api-reproducibility-snapshotter`) Actor

Fetch bounded public or authorized JSON APIs with GET-only requests, deterministic canonical snapshots, pagination/cache evidence, redacted metadata, and optional baseline comparison. $0.05 per normalized API page.

- **URL**: https://apify.com/flintglade/public-api-reproducibility-snapshotter.md
- **Developed by:** [Flintglade](https://apify.com/flintglade) (community)
- **Categories:** Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 api page snapshots

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Public API Reproducibility Snapshotter

Fetch bounded public or user-authorized JSON API pages with GET-only requests,
preserve request/response evidence, canonicalize the payload, record pagination
and cache behavior, and compare later snapshots deterministically.

### What this does not do

- It does not crawl arbitrary websites or follow unconfigured links.
- It does not send POST, PUT, PATCH, or DELETE requests.
- It does not automate a browser.
- It does not discover or bypass credentials.
- It does not claim that an observed schema is a provider's complete contract.
- It does not execute links or code found in responses.

### Inputs and cost

Provide 1 to 100 explicit HTTPS JSON URLs. Pagination is declared per request
and is capped at 20 pages. Optional headers are secret fields and are
allowlisted. `volatileJsonPointers` removes only explicitly named fields from
the canonical comparison; the output manifest records every removal attempt.

The default example is one Flintglade-controlled fixture page. One successfully
normalized page, including a valid 304 reconstruction, is one
`api-page-snapshot` event at $0.05. Ten normalized pages are up to $0.50 in
Actor events, plus any platform usage shown by Apify. A blocked URL, invalid
pagination, authentication failure, rate-limit exhaustion, transient failure,
invalid JSON, or oversized response is not charged. The Actor stops scheduling
new pages when the run charge cap is reached. The synthetic
`apify-default-dataset-item` event is disabled; summaries and failure rows are
uncharged.

### Sources and authorization

The Actor fetches only explicit user URLs that satisfy the HTTPS, DNS, redirect,
body-size, and content-type gates. A user must have authorization to request
any protected endpoint and must supply credentials through masked Apify input.
No automatic HTML fallback exists. Source metadata is evidence from the
provider, not a universal truth claim.

### Output

Each normalized page is a result envelope containing the redacted request,
response status and safe headers, redirect chain, raw hash, canonical payload,
observational schema, pagination manifest, cache metadata, and the AP-001
schema-drift section. The raw response is retained only when `retainRaw` is
true. Large artifacts belong in run storage rather than a dataset cell.

The run ends with one uncharged `run-summary` row containing requested,
normalized, reused, failed, and charged counts. Failure states distinguish
input rejection, source outage, rate limit, invalid response, terminal 404/410,
and internal invariant failures. A contacted 404/410 is a chargeable terminal
negative page result because the evidence is the requested outcome.

### Persistent monitoring requires a named key-value store

One-off runs are stateless. Persistent comparison uses the user-selected
`baselineStoreId`; the Actor never silently falls back to stateless mode when a
requested store is unavailable. A baseline is committed only after Apify
accepts the charged result. A 304 reuses a validated prior canonical payload;
an outage cannot erase or advance a baseline.

### Data handling and limitations

Apify run storage and the user-selected Apify key-value store receive the
output. Flintglade does not receive payment-card data and no external database,
advertising tracker, or hidden analytics is embedded. Delete run data through
Apify. Raw source bytes are not retained by default. Query values, credentials,
cookies, signed URLs, and authorization headers are redacted from output and
logs. The Actor is not a source-of-truth certification service.

### Support

Support: `support@flintglade.com`. See `CHANGELOG.md` for release changes and
`SOURCE_POLICY.md` for the current source contract and maintenance probe.

# Actor input Schema

## `schemaVersion` (type: `integer`):

Input contract version; changing it requires an explicit migration.
## `requests` (type: `array`):

Explicit HTTPS JSON API URLs. Each configured page can create one charged event when normalized successfully.
## `headers` (type: `object`):

Optional allowlisted authorization or cache headers. Values are never echoed or logged and can affect source access.
## `volatileJsonPointers` (type: `array`):

Explicit JSON Pointer paths excluded from canonical comparison. Every exclusion is listed in the output manifest.
## `baselineStoreId` (type: `string`):

Optional user-selected Apify key-value store for persistent comparison history. It is required only for persistent monitoring.
## `retainRaw` (type: `boolean`):

Whether bounded raw response bytes are retained in run storage; this does not change the event unit.
## `maxResponseBytes` (type: `integer`):

Compressed and decompressed body bound. Oversized responses are rejected before normalization and are uncharged.
## `concurrency` (type: `integer`):

Bounded concurrent request entries; lower values reduce load and do not increase the event price.

## Actor input object example

```json
{
  "schemaVersion": 1,
  "requests": [
    {
      "url": "https://flintglade-tools.github.io/apify-fixtures/api/single-page.json",
      "pagination": {
        "mode": "none"
      }
    }
  ],
  "retainRaw": false,
  "maxResponseBytes": 5000000,
  "concurrency": 4
}
````

# Actor output Schema

## `defaultDataset` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `artifacts` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "requests": [
        {
            "url": "https://flintglade-tools.github.io/apify-fixtures/api/single-page.json",
            "pagination": {
                "mode": "none"
            }
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("flintglade/public-api-reproducibility-snapshotter").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "requests": [{
            "url": "https://flintglade-tools.github.io/apify-fixtures/api/single-page.json",
            "pagination": { "mode": "none" },
        }] }

# Run the Actor and wait for it to finish
run = client.actor("flintglade/public-api-reproducibility-snapshotter").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "requests": [
    {
      "url": "https://flintglade-tools.github.io/apify-fixtures/api/single-page.json",
      "pagination": {
        "mode": "none"
      }
    }
  ]
}' |
apify call flintglade/public-api-reproducibility-snapshotter --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=flintglade/public-api-reproducibility-snapshotter",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Public API Reproducibility Snapshotter",
        "description": "Fetch bounded public or authorized JSON APIs with GET-only requests, deterministic canonical snapshots, pagination/cache evidence, redacted metadata, and optional baseline comparison. $0.05 per normalized API page.",
        "version": "0.1",
        "x-build-id": "B431ltsxcM0UERtUo"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/flintglade~public-api-reproducibility-snapshotter/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-flintglade-public-api-reproducibility-snapshotter",
                "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/flintglade~public-api-reproducibility-snapshotter/runs": {
            "post": {
                "operationId": "runs-sync-flintglade-public-api-reproducibility-snapshotter",
                "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/flintglade~public-api-reproducibility-snapshotter/run-sync": {
            "post": {
                "operationId": "run-sync-flintglade-public-api-reproducibility-snapshotter",
                "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",
                "required": [
                    "requests"
                ],
                "properties": {
                    "schemaVersion": {
                        "title": "Input schema version",
                        "minimum": 1,
                        "maximum": 1,
                        "type": "integer",
                        "description": "Input contract version; changing it requires an explicit migration.",
                        "default": 1
                    },
                    "requests": {
                        "title": "API page requests",
                        "minItems": 1,
                        "maxItems": 100,
                        "type": "array",
                        "description": "Explicit HTTPS JSON API URLs. Each configured page can create one charged event when normalized successfully.",
                        "items": {
                            "type": "object",
                            "additionalProperties": false,
                            "properties": {
                                "url": {
                                    "title": "URL",
                                    "type": "string",
                                    "maxLength": 2048,
                                    "description": "Explicit public or user-authorized HTTPS JSON endpoint. It triggers bounded GET requests and is retained as redacted provenance."
                                },
                                "pagination": {
                                    "title": "Pagination",
                                    "type": "object",
                                    "editor": "json",
                                    "description": "Optional bounded pagination strategy for this explicit URL.",
                                    "additionalProperties": false,
                                    "properties": {
                                        "mode": {
                                            "title": "Mode",
                                            "type": "string",
                                            "enum": [
                                                "none",
                                                "linkHeader",
                                                "nextUrlField",
                                                "pageParameter"
                                            ],
                                            "default": "none",
                                            "description": "Follow only this declared pagination mechanism, at most 20 pages."
                                        },
                                        "nextUrlJsonPointer": {
                                            "title": "Next URL JSON Pointer",
                                            "type": "string",
                                            "maxLength": 256,
                                            "description": "Required for nextUrlField mode; points to the next same-origin URL."
                                        },
                                        "pageParameter": {
                                            "title": "Page query parameter",
                                            "type": "string",
                                            "maxLength": 64,
                                            "description": "Required for pageParameter mode; the Actor starts at page 1 and increments it."
                                        },
                                        "maxPages": {
                                            "title": "Maximum pages",
                                            "type": "integer",
                                            "minimum": 1,
                                            "maximum": 20,
                                            "default": 20,
                                            "description": "Hard page bound for this request; it affects the maximum possible event count."
                                        }
                                    }
                                }
                            },
                            "required": [
                                "url"
                            ]
                        }
                    },
                    "headers": {
                        "title": "Optional request headers",
                        "maxProperties": 10,
                        "type": "object",
                        "description": "Optional allowlisted authorization or cache headers. Values are never echoed or logged and can affect source access.",
                        "additionalProperties": true
                    },
                    "volatileJsonPointers": {
                        "title": "Volatile JSON Pointers",
                        "maxItems": 50,
                        "type": "array",
                        "description": "Explicit JSON Pointer paths excluded from canonical comparison. Every exclusion is listed in the output manifest.",
                        "items": {
                            "type": "string",
                            "maxLength": 256
                        }
                    },
                    "baselineStoreId": {
                        "title": "Named baseline store",
                        "type": "string",
                        "description": "Optional user-selected Apify key-value store for persistent comparison history. It is required only for persistent monitoring."
                    },
                    "retainRaw": {
                        "title": "Retain raw response",
                        "type": "boolean",
                        "description": "Whether bounded raw response bytes are retained in run storage; this does not change the event unit.",
                        "default": false
                    },
                    "maxResponseBytes": {
                        "title": "Maximum response bytes",
                        "minimum": 1000,
                        "maximum": 20000000,
                        "type": "integer",
                        "description": "Compressed and decompressed body bound. Oversized responses are rejected before normalization and are uncharged.",
                        "default": 5000000
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "Bounded concurrent request entries; lower values reduce load and do not increase the event price.",
                        "default": 4
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
