paste-free.openapps.xyz

Source

This app’s code and revision history are public. Download a copy or explore the files below.

Public
The app’s code and revision history are public.
Owned app · rev 01fdb2b1f66e
Run it yourself
Take the whole tree and run it on your own machine. The download needs no account. Cloning needs a sign-in.
Download .zip
bounded clone 6eca480d6447d873e2e5eed9
A copy you download is not bounded. The guarantees this app runs under - declared egress, proven invariants, writes that fail closed - live in the runtime serving this page, not in the files. What you get is auditable source you can read and run, with no runtime guarantees attached.
← All files
public/openapi.json
{
  "openapi": "3.1.0",
  "info": {
    "title": "Paste by OpenApps",
    "version": "1.1.0",
    "summary": "Share text, code and logs by link. Free, no account, no key.",
    "description": "Paste is a free alternative to Pastebin and GitHub Gist. Every paste is unlisted: anyone with its link can read it, and nobody can list or search pastes. Creating a paste returns an ownerKey; send it in the x-owner-key header to edit or delete the paste. Pastes encrypted in the web app (with a password or a key in the link) hold only scrambled text and cannot be read through the API. Errors are JSON with a plain error sentence. Notes for assistants: https://paste-free.openapps.xyz/llms.txt",
    "contact": {
      "name": "OpenApps",
      "url": "https://free-apps.openapps.xyz/"
    }
  },
  "externalDocs": {
    "description": "Notes for assistants (llms.txt)",
    "url": "https://paste-free.openapps.xyz/llms.txt"
  },
  "servers": [
    {
      "url": "https://functions.bounded.sh/apps/6eca480d6447d873e2e5eed9/api"
    }
  ],
  "paths": {
    "/": {
      "get": {
        "operationId": "listRoutes",
        "summary": "List the routes",
        "responses": {
          "200": {
            "description": "The routes, one line each, and the limits.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/pastes": {
      "post": {
        "operationId": "createPaste",
        "summary": "Make a paste and get its link",
        "description": "Send a JSON object, or send the text itself with content-type text/plain and put the options in the query string. Request bodies are capped at 128 KiB.",
        "parameters": [
          {
            "name": "title",
            "in": "query",
            "description": "With a text/plain body: the title.",
            "schema": {
              "type": "string",
              "maxLength": 200
            }
          },
          {
            "name": "language",
            "in": "query",
            "description": "With a text/plain body: the language. Leave it out to detect it.",
            "schema": {
              "$ref": "#/components/schemas/Language"
            }
          },
          {
            "name": "expires",
            "in": "query",
            "description": "With a text/plain body: when it expires.",
            "schema": {
              "$ref": "#/components/schemas/Expires"
            }
          },
          {
            "name": "burn",
            "in": "query",
            "description": "With a text/plain body: 1 deletes the paste the first time anyone reads it.",
            "schema": {
              "type": "string",
              "enum": [
                "1",
                "0",
                "true",
                "false"
              ]
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NewPaste"
              },
              "example": {
                "content": "2026-10-19 12:00:01 ERROR timeout after 30s",
                "title": "build log",
                "expires": "1d"
              }
            },
            "text/plain": {
              "schema": {
                "type": "string"
              },
              "example": "#!/bin/sh\necho deploy\n"
            }
          }
        },
        "responses": {
          "201": {
            "description": "The paste was made.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CreatedPaste"
                },
                "example": {
                  "id": "Xk7mP2qRtW9a",
                  "url": "https://paste-free.openapps.xyz/Xk7mP2qRtW9a",
                  "rawUrl": "https://functions.bounded.sh/apps/6eca480d6447d873e2e5eed9/api/pastes/Xk7mP2qRtW9a/raw",
                  "title": "build log",
                  "language": "text",
                  "size": 61,
                  "encrypted": false,
                  "password": false,
                  "burn": false,
                  "createdAt": "2026-10-19T12:00:00.000Z",
                  "expiresAt": "2026-10-20T12:00:00.000Z",
                  "adminUrl": "https://paste-free.openapps.xyz/Xk7mP2qRtW9a/admin#k=OWNER_KEY",
                  "ownerKey": "OWNER_KEY"
                }
              }
            }
          },
          "400": {
            "description": "The body or an option is wrong.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "expires must be never, 10m, 1h, 1d, 1w, 1mo, 1y, or a number of seconds from 60 to 31536000."
                }
              }
            }
          },
          "405": {
            "description": "Pastes cannot be listed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Use POST /pastes to make a paste. Nobody can list pastes."
                }
              }
            }
          }
        }
      }
    },
    "/pastes/{id}": {
      "get": {
        "operationId": "getPaste",
        "summary": "Read a paste as JSON",
        "description": "Reading a burn-after-reading paste deletes it, and the answer has deleted: true. Add peek=1 to see a burn paste's details without its content and without deleting it.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The paste's id: 12 letters and digits, the last part of its link.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9]{12}$"
            },
            "example": "Xk7mP2qRtW9a"
          },
          {
            "name": "peek",
            "in": "query",
            "description": "For a burn paste: details only, and it is not deleted.",
            "schema": {
              "type": "string",
              "enum": [
                "1"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The paste.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PasteWithContent"
                },
                "example": {
                  "id": "Xk7mP2qRtW9a",
                  "url": "https://paste-free.openapps.xyz/Xk7mP2qRtW9a",
                  "rawUrl": "https://functions.bounded.sh/apps/6eca480d6447d873e2e5eed9/api/pastes/Xk7mP2qRtW9a/raw",
                  "title": "build log",
                  "language": "text",
                  "size": 61,
                  "encrypted": false,
                  "password": false,
                  "burn": false,
                  "createdAt": "2026-10-19T12:00:00.000Z",
                  "expiresAt": "2026-10-20T12:00:00.000Z",
                  "content": "2026-10-19 12:00:01 ERROR timeout after 30s"
                }
              }
            }
          },
          "404": {
            "description": "The paste does not exist, expired, or was already read once.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "This paste does not exist. It may have expired, or been deleted after it was read."
                }
              }
            }
          }
        }
      },
      "patch": {
        "operationId": "updatePaste",
        "summary": "Edit a paste (owner)",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The paste's id: 12 letters and digits, the last part of its link.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9]{12}$"
            },
            "example": "Xk7mP2qRtW9a"
          },
          {
            "name": "x-owner-key",
            "in": "header",
            "required": true,
            "description": "The ownerKey returned when the paste was made.",
            "schema": {
              "type": "string"
            },
            "example": "OWNER_KEY"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PastePatch"
              },
              "example": {
                "title": "build log, fixed",
                "language": "text"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The updated paste, without its content.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Paste"
                },
                "example": {
                  "id": "Xk7mP2qRtW9a",
                  "url": "https://paste-free.openapps.xyz/Xk7mP2qRtW9a",
                  "rawUrl": "https://functions.bounded.sh/apps/6eca480d6447d873e2e5eed9/api/pastes/Xk7mP2qRtW9a/raw",
                  "title": "build log, fixed",
                  "language": "text",
                  "size": 61,
                  "encrypted": false,
                  "password": false,
                  "burn": false,
                  "createdAt": "2026-10-19T12:00:00.000Z",
                  "expiresAt": "2026-10-20T12:00:00.000Z"
                }
              }
            }
          },
          "400": {
            "description": "Nothing to change, or a value is wrong.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send content, title, language, or any of them."
                }
              }
            }
          },
          "401": {
            "description": "No owner key was sent.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send the paste's owner key in the x-owner-key header."
                }
              }
            }
          },
          "403": {
            "description": "The owner key is wrong.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That owner key does not match this paste."
                }
              }
            }
          },
          "404": {
            "description": "The paste does not exist, expired, or was already read once.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "This paste does not exist. It may have expired, or been deleted after it was read."
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deletePaste",
        "summary": "Delete a paste (owner)",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The paste's id: 12 letters and digits, the last part of its link.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9]{12}$"
            },
            "example": "Xk7mP2qRtW9a"
          },
          {
            "name": "x-owner-key",
            "in": "header",
            "required": true,
            "description": "The ownerKey returned when the paste was made.",
            "schema": {
              "type": "string"
            },
            "example": "OWNER_KEY"
          }
        ],
        "responses": {
          "200": {
            "description": "Deleted.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "deleted": {
                      "type": "boolean",
                      "const": true
                    }
                  },
                  "required": [
                    "id",
                    "deleted"
                  ]
                },
                "example": {
                  "id": "Xk7mP2qRtW9a",
                  "deleted": true
                }
              }
            }
          },
          "401": {
            "description": "No owner key was sent.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "Send the paste's owner key in the x-owner-key header."
                }
              }
            }
          },
          "403": {
            "description": "The owner key is wrong.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "That owner key does not match this paste."
                }
              }
            }
          },
          "404": {
            "description": "The paste does not exist, expired, or was already read once.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "This paste does not exist. It may have expired, or been deleted after it was read."
                }
              }
            }
          }
        }
      }
    },
    "/pastes/{id}/raw": {
      "get": {
        "operationId": "getPasteRaw",
        "summary": "Read a paste as plain text",
        "description": "Also deletes a burn-after-reading paste.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The paste's id: 12 letters and digits, the last part of its link.",
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9]{12}$"
            },
            "example": "Xk7mP2qRtW9a"
          }
        ],
        "responses": {
          "200": {
            "description": "The paste's text.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                },
                "example": "2026-10-19 12:00:01 ERROR timeout after 30s"
              }
            }
          },
          "404": {
            "description": "The paste does not exist, expired, or was already read once.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "This paste does not exist. It may have expired, or been deleted after it was read."
                }
              }
            }
          },
          "409": {
            "description": "The paste is encrypted in the browser.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "error": "This paste is encrypted in the browser. Open its full link in a browser to read it."
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ]
      },
      "Language": {
        "type": "string",
        "enum": [
          "text",
          "markdown",
          "javascript",
          "typescript",
          "python",
          "json",
          "html",
          "css",
          "bash",
          "sql",
          "yaml",
          "xml",
          "diff",
          "go",
          "rust",
          "java",
          "kotlin",
          "swift",
          "c",
          "cpp",
          "csharp",
          "php",
          "ruby"
        ]
      },
      "Expires": {
        "description": "never, 10m, 1h, 1d, 1w, 1mo (30 days), 1y (365 days), or seconds from 60 to 31536000.",
        "oneOf": [
          {
            "type": "string",
            "enum": [
              "never",
              "10m",
              "1h",
              "1d",
              "1w",
              "1mo",
              "1y"
            ]
          },
          {
            "type": "integer",
            "minimum": 60,
            "maximum": 31536000
          }
        ]
      },
      "NewPaste": {
        "type": "object",
        "required": [
          "content"
        ],
        "properties": {
          "content": {
            "type": "string",
            "description": "The text."
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "language": {
            "$ref": "#/components/schemas/Language"
          },
          "expires": {
            "$ref": "#/components/schemas/Expires"
          },
          "burn": {
            "type": "boolean",
            "description": "true deletes the paste the first time anyone reads it."
          }
        }
      },
      "PastePatch": {
        "type": "object",
        "properties": {
          "content": {
            "type": "string"
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "language": {
            "$ref": "#/components/schemas/Language"
          }
        }
      },
      "Paste": {
        "type": "object",
        "required": [
          "id",
          "url",
          "rawUrl",
          "title",
          "language",
          "size",
          "encrypted",
          "password",
          "burn",
          "createdAt",
          "expiresAt"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "The page to send a person."
          },
          "rawUrl": {
            "type": "string",
            "format": "uri",
            "description": "The plain text, for programs."
          },
          "title": {
            "type": "string"
          },
          "language": {
            "type": "string"
          },
          "size": {
            "type": "integer",
            "description": "Bytes."
          },
          "encrypted": {
            "type": "boolean",
            "description": "Encrypted in the browser; content is scrambled text."
          },
          "password": {
            "type": "boolean",
            "description": "Locked with a password (only when encrypted)."
          },
          "burn": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "expiresAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        }
      },
      "PasteWithContent": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Paste"
          },
          {
            "type": "object",
            "properties": {
              "content": {
                "type": "string"
              },
              "deleted": {
                "type": "boolean",
                "description": "true when this read deleted a burn paste."
              }
            }
          }
        ]
      },
      "CreatedPaste": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Paste"
          },
          {
            "type": "object",
            "required": [
              "adminUrl",
              "ownerKey"
            ],
            "properties": {
              "adminUrl": {
                "type": "string",
                "format": "uri",
                "description": "The owner's page to edit or delete the paste. Give it only to the person the paste belongs to."
              },
              "ownerKey": {
                "type": "string",
                "description": "Send it in x-owner-key to edit or delete. Treat it like a password."
              }
            }
          }
        ]
      }
    }
  }
}

Change history

Quality pass: password lock, year expiry, line links, text/plain API
01fdb2b1f6 · 4 hours ago
Bounded source sync
fe5788c2d2 · 1 day ago
Bounded source sync
ac6f7dbc95 · 1 day ago
Bounded source sync
0a45926293 · 1 day ago