overview
pipes can access the screenpipe API to read screen data, manage meetings, send notifications, and more. by default, pipes have full access to every endpoint — no restrictions. if you want to limit what a pipe can do, add apermissions block to the YAML frontmatter in pipe.md. this is useful for:
- preventing accidents — a pipe that reads meetings shouldn’t be able to stop one
- least privilege — pipes from the store should only access what they need
- safety — deny destructive endpoints like
/data/delete-range
quick start
presets
reader — safe read-only defaults
everything else is denied.
writer — reader + write operations
reader endpoints, plus:
admin — full access (explicit)
permissions block, but creates a token for logging/auditing.
custom rules
for fine-grained control, useallow and deny lists with Api(METHOD /path) patterns:
pattern syntax
* in the method position matches GET, POST, PUT, DELETE, etc.
* in the path position matches any sequence of characters.
evaluation order
rules are evaluated in this order — first match wins:- deny — if the request matches any deny rule, it’s blocked (403)
- allow — if the request matches any allow rule, it passes
- default allowlist — if
allowis empty and the pipe uses a preset with defaults (reader/writer), the default list is checked - reject — if nothing matched, the request is blocked
examples
deny specific endpoints (keep full access otherwise):data access rules
data filtering uses the sameallow/deny lists with App(), Window(), and Content() rules:
deny rules always win over allow rules. if no rules of a given type exist, everything is allowed.
how it works
when a pipe has any restrictions (permissions block, data filters, etc.):- screenpipe generates a unique token (
sp_pipe_*) for the pipe session - the token is registered with the server middleware
- every API request from the pipe includes the token in
Authorization: Bearer sp_pipe_* - the middleware checks
is_endpoint_allowed(method, path)before forwarding - the Pi extension also enforces rules client-side (blocks curl commands before they run)
- when the pipe finishes, the token is cleaned up