canonical: https://jentic.com/apis/papyrs.com/main

# Papyrs API

Jentic publishes the only available OpenAPI specification for Papyrs API, keeping it validated and agent-ready. The Papyrs API allows developers to integrate services and apps with Papyrs intranet, providing endpoints for managing pages, widgets (text boxes, headings, attachments), records, search, people, and activity feed. It powers intranet automation, content management, and team collaboration workflows.

## For AI agents

Manage intranet pages, widgets, records, search, people, and activity feed across 19 endpoints.

## Scope

Does not handle billing, site settings, or SSO configuration - use for content management, search, and activity stream only.

## Capabilities

- Create, retrieve, update, and delete intranet pages
- Manage page widgets including paragraphs, headings, and attachments
- Upload and download file attachments
- Retrieve form records from pages with pagination
- Search the intranet for pages, comments, files, people, and forms
- Manage people directory and user accounts
- Post to activity stream and page discussions
- Control page permissions and notifications

## Use cases

### Intranet Page Management

Create and manage intranet pages with content widgets, layout, permissions, and notifications. POST `/pages/create`/ creates pages with title, json content (columns of widgets), optional layout, permissions map, and notifications. Essential for programmatic content management and page automation.

Example prompt: POST `/pages/create`/ with title, json array of widget columns, permissions, and notifications

### Widget Content Management

Manage individual widgets (text boxes, headings, attachments) on pages. POST `/page/{page_id}/paragraph/create`/ adds text content, POST `/attachment/create`/ uploads files, and UPDATE endpoints modify existing widgets. Note that updating changes the widget ID.

Example prompt: POST `/page/{page_id}/paragraph/create`/?format=html with widget.val containing HTML or text content

### Form Record Retrieval

Retrieve form submissions from pages with pagination. GET `/pages/records/{page_id}`/ returns arrays of form records with field-value pairs, supporting page and items_per_page parameters (1-250 items). Essential for collecting and processing user-submitted data.

Example prompt: GET `/pages/records/{page_id}`/?page=0&items_per_page=50 to retrieve paginated form records

### Intranet Search

Search the intranet for pages, comments, form entries, people, or files using Papyrs' built-in search engine. GET `/search/query`/?q=keyword returns results with weight (relevance), category (Page, File, Contact, Form, Comment), description, and link.

Example prompt: GET `/search/query`/?q=budget to search for budget-related content across all categories

### Agent-Driven Intranet Automation via Jentic

An AI agent managing team intranet operations can create pages, upload files, search content, and post updates through Jentic without exposing the auth_token in agent context. Jentic resolves intents like 'post to activity stream' to the right Papyrs endpoint.

Example prompt: Search Jentic for 'create intranet page', load the POST `/pages/create`/ schema, and execute

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| GET | `/pages/get/{page_id}/` | Get page details with widgets |
| GET | `/pages/all/` | Get all visible pages |
| POST | `/pages/create/` | Create a new page |
| POST | `/pages/delete/{page_id}/` | Delete a page |
| GET | `/pages/records/{page_id}/` | List all records for a page |
| GET | `/page/{page_id}/paragraph/get/{widget_id}/` | Get a paragraph widget |
| POST | `/page/{page_id}/paragraph/create/` | Create a paragraph widget |
| POST | `/page/{page_id}/paragraph/update/{widget_id}/` | Update a paragraph widget |
| POST | `/page/{page_id}/paragraph/delete/{widget_id}/` | Delete a paragraph widget |
| GET | `/page/{page_id}/heading/get/{widget_id}/` | Get a heading widget |
| POST | `/page/{page_id}/heading/create/` | Create a heading widget |
| GET | `/page/{page_id}/attachment/get/{widget_id}/` | Get an attachment widget |
| POST | `/page/{page_id}/attachment/create/` | Upload a file attachment |
| GET | `/search/query/` | Search the intranet |
| GET | `/people/all/` | Get all people |
| POST | `/people/delete/{user_id}/` | Delete a user |
| POST | `/feed/post/` | Post to the Activity Stream |
| POST | `/feed/post/{page_id}/` | Post to a page discussion |

## Key resources

- **Page** — Intranet page with widgets, layout, permissions, and notifications
- **Widget** — Content widgets including paragraphs, headings, and attachments
- **Record** — Form record submissions with field-value pairs
- **Person** — User profile in the people directory
- **FeedPost** — Activity stream post or page discussion comment

## AI readiness

This API is usable in Jentic One now. Its AI-readiness score against Jentic's framework shows where it stands today and where improvements would make it even easier for agents to use.

- **Score:** 47 / 100
- **Maturity:** Foundational
- **Dimensions:**
  - Foundational Compliance: 71 / 100
  - Developer Experience & Jentic Compatibility: 63 / 100
  - AI-Readiness & Agent Experience: 50 / 100
  - Agent Usability: 94 / 100
  - Security: 15 / 100
  - AI Discoverability: 74 / 100
- **View full report:** https://jentic.com/apis/papyrs.com/main/scorecard
- **How the score is calculated:** https://docs.jentic.com/reference/api-readiness-framework/overview/
- **More about the dimensions:** https://docs.jentic.com/reference/api-readiness-framework/specification/#dimensional-model-overview

### Score it yourself

Every API in the directory is allowlisted, so you can re-score it with no key required.

- **Score your own API:** https://jentic.com/scorecard.md
- **Scoring CLI agent skill:** https://github.com/jentic/jentic-api-scorecard/blob/main/skills/jentic-api-scorecard/SKILL.md

```sh
npx @jentic/api-scorecard-cli score <openapi-url>
```

## Why Jentic

- **Setup:** Wiring the Papyrs API by hand means passing its auth_token as a query parameter, resolving your per-site group_name host, and shaping the nested page and widget routes yourself. Through Jentic you install once, import Papyrs from the API Directory, store the token once, and your agent calls it.
- **Permission scoping:** Papyrs puts the page id in the URL path (`/pages/get/{page_id}`/ and `/page/{page_id}/paragraph/...`), so a rule can pin your agent to one page: it can read and add paragraphs and headings there. You choose the operations it may call, so destructive ones like page deletion or paragraph deletion are not included unless you add them.
- **Credential handling:** Your Papyrs auth_token is stored once, encrypted, by your own Jentic One instance and injected at execution time. It never enters the agent's prompt, logs, or context.
- **Discovery method:** Agents search Jentic by intent such as 'create an intranet page' or 'add a paragraph to a page', and Jentic returns the matching Papyrs operation with its input schema so the agent calls the right endpoint without browsing the reference docs.

## Related APIs

- **Notion API** — A Notion alternative to Papyrs, offering pages, databases, and collaborative docs your team can build and query programmatically.
- **BookStack API** — An open-source alternative to Papyrs for building structured wikis and knowledge bases with programmatic access to books, pages, and content.

## FAQ

### Why is there no official OpenAPI spec for Papyrs API?

Papyrs does not publish a complete OpenAPI specification for their API. Jentic generates and maintains this spec so that AI agents and developers can call Papyrs API via structured tooling. Get started with Jentic One, the self-hosted execution layer.

### What authentication does the Papyrs API use?

The Papyrs API uses an API token passed as the auth_token query parameter. Through Jentic, the token is stored in the encrypted vault and injected at execution time so it never enters the agent's prompt context.

### How do I create a page with content?

POST `/pages/create`/ accepts title, json (array of widget columns), optional layout, permissions, and notifications. The json field contains arrays of widgets with classname, id, and val properties defining the page content.

### What happens when I update a widget?

When you POST to update endpoints like `/page/{page_id}/paragraph/update/{widget_id}`/, the widget ID changes. The response includes version_of_id containing the original widget ID before the update.

### What are the rate limits?

Papyrs API has a default rate limit of 6 requests per 60 seconds. Exceeding this returns a 429 Too Many Requests error. Spread requests across time or use webhooks for real-time updates instead of polling.

### Can I retrieve form submissions?

Yes. GET `/pages/records/{page_id}`/ returns all form records submitted on a page with pagination support (page and items_per_page parameters). Returns an array of records, each containing field-value pairs.

### Can I limit what my agent is allowed to do with the Papyrs API?

Yes. Because you run Jentic One yourself, your own rules decide which Papyrs operations and credentials the agent may use. Since Papyrs puts the page id in the URL path, such as `/pages/get/{page_id}`/ and `/page/{page_id}/paragraph/create`/, you can pin the agent to a single page and allow only reads and adding paragraphs or headings there. Destructive operations like deleting a page or a paragraph stay out of reach unless you explicitly add them to the agent's allowed set.
