blob: d24003b9e457b5434a52badca8f175b6a1a2f723 [file]
<!--
Copyright 2026 The Go Authors. All rights reserved.
Use of this source code is governed by a BSD-style
license that can be found in the LICENSE file.
-->
{{define "main"}}
<style>
.go-Content {
max-width: 95rem;
ul, dl dt, dd { all: revert }
}
.Api-list {
list-style: none;
padding: 0;
}
.Api-item {
border-bottom: var(--border);
margin-bottom: 3rem;
padding-bottom: 2rem;
}
.Api-item:last-child {
border-bottom: none;
}
.Api-itemRow {
display: grid;
gap: 2rem;
grid-template-columns: 1fr 1fr;
}
@media (max-width: 1000px) {
.Api-itemRow {
grid-template-columns: 1fr;
}
}
.Api-itemLeft {
display: flex;
flex-direction: column;
gap: 0.5rem;
min-width: 0;
}
.Api-itemRight {
display: flex;
flex-direction: column;
min-width: 0;
}
.Api-route {
font-size: 1.25rem;
font-weight: 600;
}
.Api-details {
display: flex;
flex-direction: column;
gap: 1rem;
margin-top: 1rem;
}
.Api-label {
font-weight: 600;
color: var(--color-text);
}
.Api-paramsSection {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.Api-responseRow {
display: flex;
gap: 0.5rem;
align-items: baseline;
flex-wrap: wrap;
}
.Api-paramsTable {
border-collapse: collapse;
width: 100%;
}
.Api-paramsTable th {
text-align: left;
padding: 0.5rem 1.25rem;
font-weight: 600;
}
.Api-paramsTable th:first-child {
padding-left: 0;
}
.Api-paramsTable td {
border-top: var(--border);
vertical-align: top;
padding: 0.5rem 1.25rem;
}
.Api-paramsTable td:first-child {
padding-left: 0;
}
.Api-exampleContainer {
display: flex;
flex-direction: column;
gap: 1rem;
overflow-x: auto;
}
.Api-exampleHeading {
font-weight: 600;
color: var(--color-text);
margin-bottom: 0.5rem;
}
.Api-codeBlock {
margin: 0;
font-family: var(--font-family-mono, monospace);
font-size: 0.875rem;
line-height: 1.4;
white-space: pre;
}
</style>
<main class="go-Container" id="main-content">
<div class="go-Content">
<h1 data-test-id="api-heading">API Documentation</h1>
<p>
Pkgsite provides a JSON API for accessing information about
Go packages and modules.
</p>
<h2>Requests</h2>
<p>
All requests are GET requests whose first URL segment selects the request
type.
Except for <code>search</code>, the remaining segments
specify a module or package path. Additional arguments
are specified as query parameters.
</p>
<p>
Package paths are ambiguous: the same path <code>a/b/c</code> could be package
<code>c</code> in module <code>a/b</code>
or package <code>b/c</code> in module <code>a</code>.
If both exist, the API returns an error with a list of possible modules in its
<code>candidates</code> field.
Make a follow-up request with the <code>module</code> query parameter to
disambiguate. (Note: this behavior differs from the pkgsite UI, which selects
the longest matching module path.)
</p>
<p>Some routes accept an optional <code>version</code> query parameter.
If missing, the latest version is chosen.</p>
<p>Some routes accept optional <code>GOOS</code> and <code>GOARCH</code>
query parameters to select the desired build context of the documentation.
If omitted, the default documentation build context is selected,
typically <code>linux/amd64</code>.
</p>
<p>Some routes accept a <code>filter</code>.
Only items that match the filter are returned.
The filter must be a Go expression that returns a boolean value.
Filters support the following subset of Go:
<ul>
<li> The values <code>true</code>, <code>false</code> and <code>nil</code>.
<li> <code>==</code> and <code>!=</code> on any value.
<li> <code>+</code>, <code>-</code>,<code>*</code>,
<code>/</code> and <code>%</code> on integers.
<li><code>+</code> on strings.
<li><code>&lt;</code>, <code>&lt;=</code>, <code>&gt;</code> and <code>&gt;=</code>
on strings and integers.
<li> The following functions:
<dl>
<dt><code>contains(s, sub)</code></dt>
<dd>String <code>s</code> contains substring <code>sub</code>.</dd>
<dt><code>hasPrefix(s, pre)</code></dt>
<dd>String <code>s</code> has the prefix <code>pre</code>.</dd>
<dt><code>hasSuffix(s, suf)</code></dt>
<dd>String <code>s</code> has the suffix <code>suf</code>.</dd>
<dt><code>matches(s, re)</code></dt>
<dd>String <code>s</code> matches the regular expression <code>re</code>.</dd>
</dl>
</ul>
In addition, each route adds its own variables for the list items being filtered.
In general, each JSON field is a variable.
</p>
<p>
Most filters will need to be
percent-encoded. Go programs should call
<code>url.QueryEscape</code> to encode filters and all
other query parameter values. Or better, put all values into a <code>url.Values</code>
and then call <code>Encode</code> on that.
</p>
<h2>Responses</h2>
<p>
All routes return a JSON response.
You can find a link to the corresponding Go type for a route in the documentation below.
Errors are also returned as a JSON object, whose <code>message</code> field
contains the error message.
</p>
<p>
You can access the machine-readable <a href="/v1beta/openapi.yaml">OpenAPI Specification</a>.
</p>
<h2>Rate Limiting</h2>
<p>
Requests to the API are rate-limited to 45 queries per second (QPS) per IP block.
Exceeding the rate limit returns an HTTP status code <code>429 Too Many Requests</code>.
</p>
<h2>Pagination</h2>
<p>
Some responses are paginated. Each response page has a
<code>nextPageToken</code>, which is non-empty if there is
another page of items. To retrieve the next page, repeat
the original request verbatim, adding a <code>token</code>
query parameter whose value is the next-page token from the
response. Changing the request in any way other than providing
a token may result in an error.
</p>
<p>
As long as <code>nextPageToken</code> is non-empty,
there is another page, even if the current page has no items.
</p>
<p>
<h2>Routes</h2>
<ul class="Api-list">
{{range .Routes}}
<li class="Api-item">
<div class="Api-itemRow">
<div class="Api-itemLeft">
<div class="Api-route"><code>{{.Route}}</code></div>
<p>{{.Desc}}</p>
<div class="Api-details">
{{if .QueryParams}}
<div class="Api-paramsSection">
<span class="Api-label">Parameters:</span>
<table class="Api-paramsTable">
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
{{range .QueryParams}}
<tr>
<td><code>{{.Name}}</code></td>
<td><code>{{.Type}}</code></td>
<td>{{.Doc}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
{{end}} {{/* if .QueryParams */}}
<div class="Api-responseRow">
<span class="Api-label">Response:</span>
<code>
{{if .ResponsePaginatedType}}
<a href="https://pkg.go.dev/golang.org/x/pkgsite/internal/api#PaginatedResponse">PaginatedResponse</a>[{{if .LinkPaginatedType}}<a href="https://pkg.go.dev/golang.org/x/pkgsite/internal/api#{{.ResponsePaginatedType}}">{{.ResponsePaginatedType}}</a>{{else}}{{.ResponsePaginatedType}}{{end}}]
{{else}}
<a href="https://pkg.go.dev/golang.org/x/pkgsite/internal/api#{{.Response}}">{{.Response}}</a>
{{end}}
</code>
</div>
</div>
</div>
<div class="Api-itemRight">
<div class="Api-exampleContainer">
{{range .Examples}}
<div class="Api-exampleSection">
<div class="Api-exampleHeading">Example Request</div>
<pre class="Api-codeBlock"><code>curl -L https://pkg.go.dev{{.Request}}</code></pre>
</div>
<div class="Api-exampleSection">
<div class="Api-exampleHeading">Example Response</div>
<pre class="Api-codeBlock"><code>{{.Response}}</code></pre>
</div>
{{else}}
<div class="Api-exampleSection">
<div class="Api-exampleHeading">No Examples</div>
<p>No examples available for this route.</p>
</div>
{{end}}
</div>
</div>
</div>
</li>
{{end}}
</ul>
</div>
</main>
{{end}}