Write a decision rule before you see the text
Write the initial question as a decision you can inspect: among the received r/science records matching replication, which discuss repeating a study? Define the observation as a record and choose post, comment or both deliberately. The search selects candidate text; your local reading determines the category. Do not present a word match as evidence that an experiment was successfully replicated.
Create a local protocol entry containing a run identifier, intended route, filters, limit, page and collection time. These are your own research notes, not extra API parameters or a server snapshot identifier. Store the version of your transformation code and its dependencies separately. If your own analysis uses randomness, record its local configuration; the archive does not expose a random-sampling or seed parameter.
Reddit API Labs is an independent historical archive, not official Reddit or live data. Coverage, fixed fields, immutable results and permanent availability are not guaranteed. Saving parameters alone therefore cannot preserve the input to an experiment. Decide where your own response copies will be kept and which collaborators may receive them, respecting applicable law and third-party rights.
Record the retrieval exactly as executed
Start with https://api.redditapilabs.com/v1/search?q=replication&subreddit=science&limit=3, the homepage example. q performs text search, subreddit restricts the community and limit caps the page at three records. Send X-API-Key: <key> or Authorization: Bearer <key> from your server. The key page explains signup before payment; never include a live key in the protocol you share.
Add a query amendment entry when trying replication crisis. q matches title and text with operator and within a matching field; it does not simply join a word in the title to another in the body. Keep the broad and narrowed responses separate. Neither wording is an exhaustive vocabulary for scientific replication.
Use from and to as YYYY-MM-DD UTC dates on created_utc when the question requires a time range. The full final day is included; these filters do not represent ingestion time or hours. min_score is a numeric selection threshold without sorting or quality assessment. There is no comment-count search filter. Explain how each included filter changes your own selection rather than claiming it removes bias.
Annotate meaning without overwriting source text
Create a local annotation table with the record identifier when available, a category and a reason. Useful provisional categories are study replication, biological replication and unclear context. They are your labels, not API fields. Preserve ambiguous records for review instead of forcing a category, and keep the original text beside the version used for analysis.
Save the received bytes and parameters before cleaning records. An optional SHA256 of your saved file identifies those bytes locally; it is not an archive-issued integrity certificate or proof of source completeness. Check data and field presence. Flat records may contain parent_id or link_id for local associations, without complete ancestry or conversations. Neither identifier is an exposed search filter.
Compare two runs one variable at a time
First rerun your analysis on the saved input with the recorded code and environment, checking your own exclusions and outputs. A matching file hash only confirms that the compared bytes match. It does not verify the truth of a post, the quality of your interpretation or reproducibility of every computational step. Describe the checks you actually performed instead of announcing that the archive certifies the experiment.
For a useful comparison, first hold the saved input fixed and change only the local coding rule. Then record which decisions changed and why. A later remote retrieval receives a new run entry. If both input and rules change together, a different category count cannot be attributed to either change alone.
If you collect remotely again, give that attempt a new local entry and preserve its actual response. It may differ in records, fields or order without a promised limit on the difference. A comparison can document observed changes; it cannot by itself explain their cause or prove that changes reflect real-world activity. Reprocessing your own copy does not call the API, while successful remote repeats consume credits.
Report the stopping point and unresolved cases
End with a short run note: requested parameters, pages received, records retained, exclusions and unresolved meanings. State why collection stopped and which version of the coding rule produced the counts. Restrict conclusions to this material; an unknown total, missing context or an archive gap must not become a claim about silence in the community.
Every successful retrieval, even empty, costs one credit. Invalid requests do not debit and upstream failures refund reservations; a client timeout can follow a charged success. Mark uncertain attempts as uncertain rather than treating them as free. Handle 400 by correcting parameters, 401 by checking key and domain, 402 by checking balance and 429 with bounded delayed retries. Local processing failure does not refund a remote success.
Consult documentation for routes and pricing for $1 per 1000 successes and the $50 minimum for 50000 paid credits. The Get API key page explains conditional trial eligibility and password-confirmed regeneration, which immediately invalidates the old key. Public status only discloses static scope and HTTP response, not search health or dataset integrity. Keep account credentials and payment records out of any public experiment notebook.