Read a document body
GEThttps://
Returns one document body in the detail view: content as GitHub-Flavored Markdown, plus ?include=content_html for the sanitised-HTML projection that also carries the colours, highlights, alignment and @mentions Markdown cannot express.
Access
- Token scope
- api:
read: orapi:project_drive read: orapi:customer_drive read: orapi:organization_drive read: user_drive Without it:
403 insufficient-token-scope. - Permission
- project_drive::
access Without it:
403 insufficient-permission. - Rate cost
- 1 unit, read bucket.
- Also
If-None-Matchanswers304when nothing changed. Never cached:private, no-store. Unknown query parameters are refused, never ignored.
Both are checked, scope first. A token never does more than its user. How access is checked
Read that projection first if you intend to write the document back, because a Markdown round-trip discards all four. This endpoint first collects any edits still pending in a live editing session, so the body and the ETag describe what has actually been typed; if the collaboration server is unreachable it serves the last stored body instead of failing. The drive item's own metadata (title, folder, tags, owner, effective access) is not repeated here: read it from GET /api/v2/drive-items/{drive_item}, following drive_item_id. There is no soft delete on this resource, so neither trashed nor force is an accepted parameter. The declared permission is project_drive::access; the other three drive prefixes apply by the owning item's owner type, and the per-item rule is what actually decides.
Path parameters
Query parameters
Unknown parameters are refused with 400, naming the parameter.
Request headers
A correlation id of your own. It is recorded in our logs next to the server's request id but never returned: the response header always carries the server's id. A value that does not match the pattern is discarded silently, never rejected.
Response 200
Returns a DriveDocument in the detail view.
Headers
ETag- A strong validator of exactly this representation.
RateLimit- The IETF
httpapi-ratelimit-headersform of your remaining allowance on the tightest bucket this request touched. RateLimit-Policy- The ceiling and window of that bucket, as
<limit>;w=<seconds>. X-Request-Id- The server-generated ULID correlating this response with our logs.
Every response also carries Cache-Control, Vary, X-Content-Type-Options, X-Plnnrly-Api-Version, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Headers and versioning
Id of the document body, not of the drive item it belongs to. The two are numbered separately.
The drive item this body belongs to. Set on create and immutable afterwards; read the item itself from GET /api/v2/drive-items/{drive_item}.
The document body as GitHub-Flavored Markdown: headings, lists, task lists (- [ ]), tables, code fences, links and images all survive. Detail-only: pass ?view=detail to get it on the collection. Markdown cannot express text colours, highlights, alignment or @mentions, so read ?include=content_html first if the document may contain them: a read of content followed by a PATCH of it discards all four permanently.
Last-write timestamp; use for incremental sync. Typing in the collaborative editor moves this, not the drive item's own updated_at.
Errors
8 errors every operation can return: 304, 400, 401, 404, 406, 429, 500, 503
304 Not modified.
400 Bad request.
idempotency-key-requiredinvalid-cursorinvalid-query-parametermalformed-requestunsupported-parameter
401 Unauthenticated.
404 Not found.
406 Not acceptable.
429 Too many requests.
500 Server error.
503 Service unavailable.
This path allows GET, PATCH, DELETE. Anything else answers 405.
Something wrong or missing on this page? Tell us