Follow our getting started guide. In short: create an OSF project, link your OSF account to DataPipe, set up an experiment, and add a few lines of code to your study to send data through DataPipe to the OSF. The easiest way to get started is to sign in to DataPipe with your OSF account, which automatically authorizes DataPipe to write data on your behalf.
No. You need a separate service to host your experiment online (e.g., GitHub Pages, Netlify, or university hosting). DataPipe only handles sending data to the OSF, so you do not need to configure any backend or server components yourself.
GitHub Pages is a free option. Select "project site" and "start from scratch" in their guide.
Under normal operation, no. DataPipe routes your data to the Open Science Framework but does not keep a copy. Data passes through DataPipe for optional validation and is then sent directly to your OSF project.
The one exception is when an upload to the OSF fails (for example, due to a temporary OSF outage or rate limit). In that case, DataPipe temporarily caches the data so it can retry the upload automatically. Cached data is encrypted at rest, stored for up to one week, and deleted as soon as the upload succeeds. See the question below for details.
If the OSF is temporarily unavailable or returns an error, DataPipe will not lose your data. Failed uploads are automatically cached and retried with increasing intervals (starting at one hour, up to 24 hours) for up to five attempts over approximately one week.
Your experiment dashboard will show an orange badge for pending retries or a red badge if all retries have been exhausted. You can expand the queued files panel to see the status of each file, including the reason for failure and the number of retry attempts.
You can also download any cached file directly from the dashboard at any time, so you always have a way to recover your data even if the automatic retries do not succeed.
DataPipe is free to use.
The expensive parts of running an online experiment — hosting files and storing data — are handled by free services like GitHub Pages and the OSF. DataPipe is a lightweight bridge between them, which makes it inexpensive to operate.
DataPipe is hosted on Google Firebase. Current resource consumption is less than $1 per month. The jsPsych Open Collective account has funding reserves to sustain the service, and we aim to keep costs and available funds transparent so you can judge the service's long-term viability. If you donate a few dollars, you will likely cover the lifetime cost of providing DataPipe to you.
DataPipe does not store or log your data. Once data reaches your OSF project, visibility depends on your OSF settings. If the receiving component is private, only you and your collaborators can see the data. If it is public, anyone can.
There are a few risks to be aware of:
When enabled, DataPipe checks incoming data before sending it to the OSF. You can validate that files are well-formed JSON or CSV, and you can specify a list of required columns or fields that must be present. For JSON arrays (like jsPsych output), DataPipe checks whether the required fields appear in at least one object across the array.
Invalid files are rejected and not sent to the OSF. Rejected data cannot be recovered. This feature is designed to block malicious submissions, not to catch errors in legitimate data.
Base64 data collection lets you send binary files — like audio recordings, video, or images — encoded as base64 strings. DataPipe decodes the string and stores the resulting file in your OSF project. Each request sends one file at a time.
Validation is not currently supported for base64 data, so enabling this feature carries additional risk. We recommend keeping it active only while you are collecting data.
Yes. DataPipe has a 32 MB limit on the size of a single request. This limit is enforced by the server infrastructure and cannot be increased. Most experiment data is well under this limit — a typical jsPsych dataset is 50 KB to 5 MB.
If you are using version 0.6.0 or later of the @jspsych-contrib/plugin-pipe plugin, request bodies are automatically compressed with gzip before sending. Text data (JSON, CSV) typically compresses by 2–10x, which effectively raises the upload limit to roughly 60–300 MB for most experiment data. Compression is enabled by default and requires no configuration.
Compression is less effective for binary data sent via the base64 endpoint (e.g., video or audio recordings), because binary data does not compress as well as text. If you need to send individual files larger than about 25 MB through the base64 endpoint, they may still exceed the limit even after compression.
If you are sending data without the plugin (e.g., using fetch directly), you can compress the request body yourself using the browser's CompressionStream API and setting the Content-Encoding: gzip header. The server will decompress the body automatically.
When enabled, DataPipe assigns condition numbers sequentially. It returns a number from 0 to n−1, where n is the number of conditions you configure. For example, with 3 conditions the sequence is 0, 1, 2, 0, 1, 2, and so on. If your design has multiple factors, set n to the total number of unique cells and map each number to the appropriate factor levels in your experiment code.
When enabled, DataPipe generates a metadata file describing your data and its variables, following the Psych-DS specification. The file is stored in your OSF project as dataset_description.json and is updated automatically after each session.
One-click authentication lets you sign in to DataPipe with your OSF account. DataPipe then manages your authorization tokens automatically, including refreshing them when they expire. This is the recommended approach for most users.
The alternative is a personal access token, which you create on the OSF and paste into DataPipe. This gives you direct control but requires you to manage the token yourself. Both methods store tokens encrypted.
If you use DataPipe to collect data, please cite the following paper:
de Leeuw, J. R. (2024). DataPipe: Born-open data collection for online experiments. Behavior Research Methods, 56(3), 2499–2506. https://doi.org/10.3758/s13428-023-02161-x