API docs.
Programmatic access to quik.space.
Status
There is no public REST API today. AI agents have the MCP and x402 endpoint covered below. A human-developer REST API is planned. If you want early access when it ships, email hello@quik.space with a short note about what you want to build.
This page is the source of truth for the programmatic surface. When something changes (new tool, new error code, new rate limit) it gets updated here first. Treat any URL, header, schema, or atomic-unit value on this page as canonical. If you find a contradiction between this page and something running in production, please send the request and response (no file contents) to the support email above so we can fix it.
For AI agents
The MCP (Model Context Protocol) endpoint serves AI agents directly. It speaks JSON-RPC 2.0 over plain HTTP POST. There is no signup and no API key. For paid actions, identity is the wallet that signs the x402 authorization.
- Endpoint:
https://quik.space/mcp - Protocol: JSON-RPC 2.0 over HTTP POST
- Methods:
tools/list,tools/call - Auth: none for free actions, wallet signature for paid actions
quik.upload
Upload a file. Free for files up to 100 MB. Paid tiers apply above 100 MB (one dollar for 100 MB to 500 MB, five dollars for 500 MB to 5 GB).
{
"name": "quik.upload",
"description": "Upload a file. Free for files up to 100 MB.",
"input_schema": {
"type": "object",
"properties": {
"filename": { "type": "string" },
"content_base64": { "type": "string" },
"content_type": { "type": "string" },
"owner_email": { "type": "string", "format": "email" }
},
"required": ["filename", "content_base64"]
}
}curl
curl -X POST https://quik.space/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "quik.upload",
"arguments": {
"filename": "report.pdf",
"content_base64": "JVBERi0xLjQK...",
"content_type": "application/pdf"
}
}
}'quik.get_file_info
Return metadata for a share id or URL: size, content type, expiry, state (active, in-grace, purged). Always free.
{
"name": "quik.get_file_info",
"description": "Get metadata for a share. Always free.",
"input_schema": {
"type": "object",
"properties": {
"share_url_or_id": { "type": "string" }
},
"required": ["share_url_or_id"]
}
}curl
curl -X POST https://quik.space/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "quik.get_file_info",
"arguments": {
"share_url_or_id": "abc12345"
}
}
}'quik.extend_file
Extend a file by 30 days. Costs $2 USDC on Base via x402. Renewable indefinitely. Each call sets the new expiry to 30 days from the moment the payment clears.
{
"name": "quik.extend_file",
"description": "Extend a file by 30 days. Costs $2 USDC on Base via x402.",
"input_schema": {
"type": "object",
"properties": {
"share_url_or_id": { "type": "string" }
},
"required": ["share_url_or_id"]
}
}curl
curl -X POST https://quik.space/mcp \
-H "Content-Type: application/json" \
-H "X-Payment-Proof: <signed-x402-authorization>" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "quik.extend_file",
"arguments": {
"share_url_or_id": "abc12345"
}
}
}'x402 payments
x402 is an open standard that reuses HTTP status code 402 (Payment Required) to ask for a stablecoin micropayment before fulfilling a request. quik.space speaks x402 on every paid action. The flow is:
- 01The agent calls the tool without any payment header. If the action is paid, the server returns HTTP 402 with a structured payment requirement (amount in atomic USDC, chain, recipient address, nonce).
- 02The agent signs a USDC transfer on Base mainnet. USDC uses 6 decimals, so $2.00 is the literal integer
2000000. - 03The agent retries the original tool call with the signed payload in the
X-Payment-Proofheader. - 04The server verifies the proof through an x402 facilitator, executes the tool, and returns HTTP 200 with the result.
A stub mode exists for local development so agents can be built and tested without spending real USDC on every call. In production, the facilitator verifies a real on-chain transfer.
Two practical notes for agent authors. First, the 402 response body is the contract; do not hard-code the price or recipient address inside your agent. Read both from the 402 payload on every call, because the recipient address or asset can rotate. Second, the X-Payment-Proof value is opaque and the server treats it as a single-use token. If your retry fails with a fresh 402, generate a new authorization rather than replaying the previous proof.
Rate limits
| Endpoint | Cap | Scope |
|---|---|---|
| upload | 30 / minute | per IP |
| share | 120 / minute | per IP |
| extend | 10 / minute | per IP |
| mcp | 30 / minute | per IP |
When you hit a cap, the response is HTTP 429 with a Retry-After header (in seconds) and a JSON body carrying retry_after_seconds. IPs are SHA-256 hashed before they are stored.
The caps above are per-IP for the entire site, not per-tool. A burst of legitimate share-page traffic from one office NAT can hit the share cap. If your team needs higher limits for a known integration, email the address at the bottom of the page with your expected request shape and we will raise the cap on the network range you use.
REST API
A traditional REST API for human developers is planned. It is not live yet. The shape we are targeting is small and boring on purpose: three endpoints that mirror the three MCP tools.
POST /uploadmultipart body, returns the share id.GET /file/:idreturns metadata, never the bytes.POST /extendwith a Stripe payment intent or x402 proof bumps the expiry by 30 days.
Authentication will be a simple API key on the Authorization header. There is no signup flow yet, so the only way to get on the early-access list is to email hello@quik.space and ask. Tell us what you want to build, and we will reply with a key when the surface is ready for outside callers.
Errors
Every error response is a JSON body with a stable error code and a human readable message. The HTTP status carries the rough category. Map on the error field, not on the message text. The codes below are the full set the server can return today; we will add new codes only at minor releases and never repurpose an old one.
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_request | Malformed JSON or missing required field. |
| 402 | payment_required | This action requires a USDC payment on Base. |
| 404 | not_found | No share found for the given id. |
| 410 | purged | The file expired and was purged from storage. |
| 413 | too_large | File exceeds the 5 GB ceiling. |
| 422 | blocked | File hash matches a known-bad entry on the blocklist. |
| 429 | rate_limited | You hit a per-IP cap. See Retry-After header. |
| 500 | internal_error | Something failed on our side. Retry with backoff. |
Example bodies
429 rate_limited
{
"error": "rate_limited",
"message": "Too many requests. Try again in a moment.",
"retry_after_seconds": 30
}404 not_found
{
"error": "not_found",
"message": "No share found for that id."
}402 payment_required
{
"error": "payment_required",
"message": "This action requires a USDC payment on Base.",
"amount_atomic": "2000000",
"asset": "USDC",
"chain": "base-mainnet",
"pay_to": "0x..."
}Contact
Email hello@quik.space for early REST access, partnership questions, and bug reports. For routed support tickets go to /support.