A test key starts with rs_test_ instead of rs_live_. Posts made with it go through every check a live post gets, then stop short of the network: nothing is published, and nothing counts against your monthly uploads. Use it while you build, in CI, and in staging.
Create one in the dashboard under Developers → API keys, choosing a test key. It works with the same base URL, SDKs and workspace as your live keys.
curl -X POST https://api.reelspan.com/v1/posts/text \
-H "Authorization: Bearer $REELSPAN_TEST_KEY" \
-H "Content-Type: application/json" \
-d '{"user": "my-brand", "platform": ["x", "linkedin"], "title": "Only a test"}'import { Reelspan } from 'reelspan';
const reelspan = new Reelspan({ apiKey: process.env.REELSPAN_TEST_KEY });
const post = await reelspan.posts.text({ user: 'my-brand', platforms: ['x', 'linkedin'], title: 'Only a test' });import os
from reelspan import Reelspan
reelspan = Reelspan(api_key=os.environ["REELSPAN_TEST_KEY"])
post = reelspan.posts.text("my-brand", ["x", "linkedin"], "Only a test")What a test post does
Everything up to the moment of publishing is real:
- Your fields are validated, media is uploaded or downloaded and checked for type and size against your plan, and network rules that run before publishing apply (for example YouTube needs a title, Pinterest a board).
- The profile must exist and the key must be allowed to use it.
- Each network must have an account connected to the profile and in good standing, as for a live post. A network with no account is skipped with
profile_platform_mapping_invalid, exactly as it would be live. - Scheduling, the queue and repeats work: a scheduled test post waits for its time, then is simulated.
Then, instead of sending it to the network, Reelspan marks each network as published:
{
"success": true,
"request_id": "9b1f6c2e8a3d4f50b7e1c9a2d6f3e8b1",
"results": {
"x": { "success": true, "url": null, "post_id": "test_post_…", "test": true, "message": "Test mode: not sent to the network" },
"linkedin": { "success": true, "url": null, "post_id": "test_post_…", "test": true, "message": "Test mode: not sent to the network" }
}
}urlisnullandpost_idstarts withtest_, because no real post exists.- Post status for the request includes
"test": true. - The post appears in your history and dashboard like any other, and
upload_completedwebhooks are sent for it, so you can test your webhook handler end to end. - No upload is counted, so test posts work past the Free plan's monthly limit. Cancelling a scheduled test post refunds nothing because nothing was taken.
What is not simulated
A test post stops before anything network-specific happens, so it can't tell you whether the network would accept the post. These are only found out by a live post:
- the network's own limits on size, length, duration and format, and any processing errors;
- whether the connected account's token still works (Reelspan only checks the account is marked active);
- network options such as a TikTok privacy level the account can't use;
- first comments, which are never sent.
The sandbox network
sandbox is a pretend network that needs no connected account. Add it to platform[] on video, photo or text posts. It reads the media like a real network would and "publishes" at once.
curl -X POST https://api.reelspan.com/v1/posts/video \
-H "Authorization: Bearer $REELSPAN_TEST_KEY" \
-F "user=my-brand" \
-F "platform[]=sandbox" \
-F "title=Pipeline check" \
-F "[email protected]"With a test key, a sandbox post is simulated like any other network: url is null, and nothing counts.
With a live key, the sandbox runs for real, and these fields let you rehearse outcomes:
| Field | Effect |
|---|---|
| (none) | Succeeds with a URL like https://sandbox.reelspan.com/p/…, plus bytes_received, caption and, for photos, photos_received in its result. |
sandbox_fail=true |
Fails for good with error_code: sandbox_rejected. Use it to test your failure handling and Retry. |
sandbox_fail=retryable |
Fails with a temporary error (sandbox_unavailable), which Reelspan retries automatically before reporting it as failed. |
sandbox_delay_ms |
Waits this long (up to 120,000 ms) before finishing, to test async posts and polling. |
A sandbox post made with a live key counts as an upload against your plan, like any other network. Use a test key when you only want to check the request.
Limits
- A workspace can send 500 test posts a day (each request counts once, whatever the number of networks). The count resets at midnight UTC. Past it, test posts get 429 with
error_code: TEST_LIMIT. - Test keys share the workspace's rate limit with its live keys.
- A test key only changes how posts are published. Every other call it makes is real: creating or deleting a profile, connecting an account, setting a webhook or using AI caption credits works exactly as with a live key.
- Dashboard sessions and MCP clients signed in with OAuth always post live.