Skip to content
Language: English

API for developers

API endpoints by area

Updated 1 November 2026 7 min read

Every endpoint you can use with an API key – sorted by area, with the method, path, required scope and what it does.

This overview lists every endpoint that works with a token from an API key. All paths start with https://dock.at-harbor.com. The exact fields of each endpoint are in the OpenAPI description at https://dock.at-harbor.com/openapi.yaml.

Authentication and public endpoints

Method and pathAuthenticationPurpose
POST /v1/tokenNone (key ID and secret in the body)Exchange an API key for an access token
GET /v1/plansNonePlans and prices
GET /v1/pages/available?handle=…NoneCheck whether a handle is free

Pages

Method and pathScopePurpose
GET /v1/pagesread:pagesAll pages in the workspace with ID, handle, title, status, live version, visibility and URL
POST /v1/pageswrite:pagesCreate a page; required: handle (2–64 characters, letters, digits, hyphen) and template_key; optional title, domain_id, theme_config
GET /v1/pages/{id}read:pagesOne page; also has_unpublished_changes (true if the draft differs from the published version)
PATCH /v1/pages/{id}write:pagesChange title, handle or discoverable (listing in the directory)
PATCH /v1/pages/{id}/visibilitywrite:pagespublic, private or password (with password, 4–72 characters); takes effect immediately
POST /v1/pages/{id}/publishwrite:pagesPublish the draft; the response contains the new version
GET /v1/pages/{id}/versionsread:pagesPublished versions
GET /v1/pages/{id}/versions/{version}read:pagesOne version
POST /v1/pages/{id}/versions/{version}/restorewrite:pagesBring a version into the draft; current discards all draft changes
GET /v1/pages/{id}/seoread:pagesSEO and sharing texts
PATCH /v1/pages/{id}/seowrite:pagesseo_title, seo_description, og_title, og_description, og_image_asset_id, canonical_url, noindex
POST /v1/pages/{id}/invite-linkwrite:pagesInvite link for a private, published page; days 1–30, default 7. Otherwise 409 page_not_private or page_not_published
POST /v1/pages/{id}/invite-link/revokewrite:pagesRevoke the invite link
POST /v1/pages/{id}/uploadswrite:assetsUpload a file for a page

Draft

Method and pathScopePurpose
GET /v1/pages/{id}/draftread:pagesCurrent draft: template_key, config, theme_config, custom_css, seo, image assignments and links
PATCH /v1/pages/{id}/draftwrite:pagesAt least one of config (at most 64 KB as JSON, each text up to 5,000 characters), theme_config, custom_css (up to 50,000 characters and 65,535 bytes), seo, template_key, template_asset_bindings
GET /v1/pages/{id}/draft/validateread:pagesCheck whether the draft can be published

Blocks

Method and pathScopePurpose
GET /v1/pages/{id}/blocksread:pagesThe page's blocks
POST /v1/pages/{id}/blockswrite:pagesCreate a block; required: type and config
PATCH /v1/pages/{id}/blocks/{blockId}write:pagesEdit a block
DELETE /v1/pages/{id}/blocks/{blockId}write:pagesDelete a block
POST /v1/pages/{id}/blocks/reorderwrite:pagesSet the order
GET /v1/blocks/schemasread:pagesAll block types with the schema of their config

Types you can create: text, image, embed, spacer, social_links, form, integration, donation, modal, heading, notice, coupon, contact, opening_hours, tour, file, vcard, countdown and gallery. The links block is fixed and is not created via this endpoint. The API rejects block types outside your plan with 403 block_type_requires_plan. A block's config may be at most 128 KB as JSON, and each text in it at most 10,000 characters; in the info modal, modal_body_html may have up to 50,000 characters and at most 65,535 bytes.

Method and pathScopePurpose
GET /v1/pages/{id}/linksread:linksThe page's links
POST /v1/pages/{id}/linkswrite:linksCreate a link; required: title (1–200) and target_url_template (8–2048)
GET /v1/pages/{id}/links/{linkId}read:linksOne link
PATCH /v1/pages/{id}/links/{linkId}write:linksEdit a link
DELETE /v1/pages/{id}/links/{linkId}write:linksDelete a link
POST /v1/pages/{id}/links/reorderwrite:linksSet the order: {"order":[IDs]}

Optional fields when creating and editing: enabled, geo (country rule with mode allowlist or denylist and countries), device (separate targets per device), starts_at and ends_at (scheduling), protection_tier (bot protection) and age_restriction. Scheduling, country and device rules are available from Creator Pro. When reordering, it is enough to send the IDs that should move to the front – all other links follow in their previous order. The API rejects IDs that do not belong to the page with 422 validation_failed; details.missing_link_ids lists them.

Method and pathScopePurpose
GET /v1/short-linksread:short_linksShort links with limit, offset, sort and search q; the response contains total
POST /v1/short-linkswrite:short_linksCreate; required: target_url (http or https, 8–2048); optional title (up to 120) and custom_slug (3–32, lowercase letters, digits, hyphens)
GET /v1/short-links/{id}read:short_linksOne short link
PATCH /v1/short-links/{id}write:short_linksChange target_url or title
DELETE /v1/short-links/{id}write:short_linksDelete a short link

If the plan's short link limit is reached, the API responds with 402 plan_limit_reached.

Assets

Method and pathScopePurpose
GET /v1/assetsread:assetsThe workspace's assets
POST /v1/assetswrite:assetsUpload a file (multipart/form-data, field file; optional page_id, kind, title, alt_text)
DELETE /v1/assets/{assetId}write:assetsDelete an asset

Forms

Method and pathScopePurpose
GET /v1/formsread:formsForms
POST /v1/formswrite:formsCreate a form; required: name and fields (1–100 fields)
GET /v1/forms/{id}read:formsOne form
PATCH /v1/forms/{id}write:formsEdit a form
DELETE /v1/forms/{id}write:formsDelete a form
GET /v1/forms/{id}/summaryread:formsSummary
GET /v1/forms/{id}/submissionsread:formsSubmissions, newest first (limit 1–500, default 100; further pages via cursor = next_cursor)
GET /v1/forms/{id}/submissions/exportread:formsAll submissions as a CSV file, newest first, up to the plan's export limit (from Creator Pro); the X-Export-Truncated header shows whether it was cut short

Statistics

Method and pathScopePurpose
GET /v1/stats/pages/{id}/summaryread:statsKey figures for a page
GET /v1/stats/pages/{id}/timeseriesread:statsTime series for a page
GET /v1/stats/pages/{id}/compareread:statsComparison with the previous period
GET /v1/stats/pages/{id}/linksread:statsClicks per link
GET /v1/stats/pages/{id}/widgetsread:statsClicks on widgets
GET /v1/stats/pages/{id}/conversions/breakdownread:statsConversions for a page
GET /v1/stats/workspaces/me/summaryread:statsKey figures for all pages
GET /v1/stats/workspaces/me/timeseriesread:statsTime series for all pages
GET /v1/stats/workspaces/me/compareread:statsComparison with the previous period
GET /v1/stats/workspaces/me/top-pagesread:statsTop pages
GET /v1/stats/workspaces/me/conversions/breakdownread:statsConversions for the workspace
GET /v1/stats/workspaces/me/donationsread:donationsTotals of supporter payments

You choose the period as described under Pagination, with period or with from and to. How far back you can look depends on the plan: 365 days in Creator Pro and Agency, 730 days in Enterprise. Older periods are cut back to this limit.

Push (read only)

Method and pathScopePurpose
GET /v1/push/historyread:statsPush history (limit, offset)
GET /v1/push/usageread:statsUsage of the weekly limit

Sending push notifications and managing push rules is only possible in the dashboard.

Workspace, templates and domains

Method and pathScopePurpose
GET /v1/workspaces/me/entitlementsread:workspacesPlan features and limits
GET /v1/workspaces/me/usageread:workspacesCurrent usage
GET /v1/workspaces/me/usage/meteringread:workspacesUsage history
GET /v1/workspaces/me/membersread:workspacesMember list
GET /v1/workspaces/me/settingsread:workspacesWorkspace settings
GET /v1/workspaces/me/callback-secretsread:workspacesCallback secrets (without the plain-text secret)
GET /v1/workspaces/me/callback-secrets/{id}read:workspacesOne callback secret (without the plain-text secret)
GET /v1/templatesread:workspacesAll templates
GET /v1/templates/availableread:workspacesBuilt-in and active workspace templates with valid template_key values; workspace templates have the key ws:<key> and type workspace
GET /v1/templates/{key}read:workspacesOne template
GET /v1/workspaces/me/templatesread:workspacesYour own workspace templates
GET /v1/workspaces/me/templates/{id}read:workspacesOne workspace template
POST, PATCH, DELETE /v1/workspaces/me/templates[/{id}]write:templatesCreate, edit, delete workspace templates; html at most 60,000 bytes (otherwise 422 validation_failed with details.reason maxBytes), up to 32 asset_slots
GET /v1/domainsread:workspacesCustom domains
GET /v1/domains/availableread:workspacesDomains available for pages

Not available with API keys

Webhooks, integrations, sending push notifications, managing domains, members, billing and deleting pages are only available in the dashboard. Callback secrets, too, can only be created and managed in the dashboard; listing and reading them (without the secret in plain text) works with read:workspaces. The complete list is in Scopes in detail. Incoming data – sales and your own live data – you send with separate secrets to the endpoints described in Callbacks.

Nothing found?

Tell us what you need, and our support team will help you personally.

Contact support