Sales Pages
A sales page is a public page (url) where clients buy a single
product: one-time when interval is null, or a subscription billed
every interval. Each purchase creates an invoice (and, for
subscriptions, a subscription) for the buyer's client.
Statuses: draft (only visible to the account), published (anyone
with the url can buy). Status can't be set through update. Use
/publish and /unpublish instead.
To deliver a digital product, link to a file hosted elsewhere with
file: { url }. Images are managed in the app.
Deleted sales pages can't be bought and are hidden until you restore them.
The sales page object
- Name
id- Type
- string
- Description
Example:
0abcDEF1234567890xyzAB.
- Name
status- Type
- string
- Description
One of
draft,published.
- Name
title- Type
- string
- Name
description- Type
- string or null
- Name
url- Type
- string
- Description
Public page where clients buy.
- Name
image_url- Type
- string or null
- Name
file- Type
- object or null
- Description
Digital product the buyer can download after paying.
- Name
file.type- Type
- string
- Description
One of
upload,url.
- Name
file.url- Type
- string
- Description
The linked URL for
urlfiles. For uploads, a temporary download link valid for 5 minutes, untilexpires_at. Fetch the sales page again for a new one.
- Name
file.expires_at- Type
- timestamp or null
- Description
When
urlstops working.nullforurlfiles. Example:2024-06-15T12:00:00.000000Z.
- Name
currency- Type
- string
- Description
Three-letter currency code, in lowercase. Example:
usd.
- Name
language- Type
- string
- Description
Two-letter language code, in lowercase. One of
da,en,fr,de,it,no,pt,es.
- Name
interval- Type
- string or null
- Description
Billing interval for subscriptions.
nullmeans a one-time purchase. One ofweekly,biweekly,four_weeks,monthly,eight_weeks,twelve_weeks,quarterly,biannual,yearly.
- Name
amount- Type
- integer
- Description
Price before discounts and taxes. Example:
10000. Min 0.
- Name
discounts- Type
- array of object
- Name
discounts[].amount- Type
- integer or null
- Description
Fixed amount off, in cents. Example:
10000. Min 0.
- Name
discounts[].percent- Type
- string or null
- Description
Percent off the subtotal, as a decimal string without trailing zeros. Example:
12.5.
- Name
discount_amount- Type
- integer
- Description
Amount in the smallest currency unit (cents). Example:
10000. Min 0.
- Name
taxable_amount- Type
- integer
- Description
Amount in the smallest currency unit (cents). Example:
10000. Min 0.
- Name
tax_rates- Type
- array of object
- Name
tax_rates[].id- Type
- string
- Description
The tax rate's ID. Use it in
tax_rates. Example:0abcDEF1234567890xyzAB.
- Name
tax_rates[].name- Type
- string
- Description
Example:
TPS.
- Name
tax_rates[].percentage- Type
- string
- Description
Percentage as a decimal string, without trailing zeros. Example:
5.
- Name
tax_rates[].amount- Type
- integer
- Description
Tax amount for this rate. Example:
10000. Min 0.
- Name
tax_amount- Type
- integer
- Description
Amount in the smallest currency unit (cents). Example:
10000. Min 0.
- Name
total- Type
- integer
- Description
What the buyer pays (per interval for subscriptions). Example:
10000. Min 0.
- Name
accept_cards- Type
- boolean
- Description
Whether buyers can pay by card online.
- Name
custom_field- Type
- object or null
- Description
Extra question asked to the buyer at checkout.
- Name
custom_field.label- Type
- string
- Name
custom_field.description- Type
- string or null
- Name
custom_field.required- Type
- boolean
- Name
created_at- Type
- timestamp
- Description
Date and time in UTC. Example:
2024-06-15T12:00:00.000000Z.
- Name
updated_at- Type
- timestamp
- Description
Date and time in UTC. Example:
2024-06-15T12:00:00.000000Z.
- Name
is_deleted- Type
- boolean
The sales page object
{
"id": "0abcDEF1234567890xyzAB",
"status": "published",
"title": "Photography course",
"description": "Ten lessons to master your camera.",
"url": "https://pay.tallymark.com/p/0abcDEF1234567890xyzAB",
"image_url": null,
"file": {
"type": "url",
"url": "https://example.com/course.pdf",
"expires_at": null
},
"currency": "usd",
"language": "en",
"interval": null,
"amount": 10000,
"discounts": [],
"discount_amount": 0,
"taxable_amount": 10000,
"tax_rates": [],
"tax_amount": 0,
"total": 10000,
"accept_cards": true,
"custom_field": null,
"created_at": "2024-06-15T12:00:00.000000Z",
"updated_at": "2024-06-15T12:00:00.000000Z",
"is_deleted": false
}List sales pages
Query parameters
- Name
search- Type
- string
- Description
Matches title and description. Not case-sensitive. Example:
photography.
- Name
status- Type
- string
- Description
One of
draft,published.
- Name
limit- Type
- integer
- Description
Number of results per page. Default:
10. Min 1. Max 100.
- Name
cursor- Type
- string
- Description
To get the next page, pass the
next_cursorfrom the previous response.
- Name
created_at- Type
- object
- Description
Keys
gt,gte,lt,lte. Example:created_at[gt]=2024-06-15T12:00:00.000000Z.
- Name
updated_at- Type
- object
- Description
Keys
gt,gte,lt,lte. Example:updated_at[gt]=2024-06-15T12:00:00.000000Z.
Response
- Name
200- Description
Paginated sales pages. Returns a paginated list of sales page objects.
Errors
- Name
400- Type
- request_failed
- Description
Your request could not be processed.
- Name
400- Type
- api_version_unsupported
- Description
The requested API version is not supported. Current version: 2026-08-21
- Name
401- Type
- api_key_missing
- Description
The API key is missing.
- Name
401- Type
- api_key_invalid
- Description
The API key is invalid or has been revoked.
- Name
422- Description
The request body or query parameters are invalid.
- Name
429- Description
Too many requests. The limit is 300 requests per 5 minutes.
Request
curl https://api.tallymark.com/sales-pages \
-H "Authorization: Bearer $TALLYMARK_API_KEY"Response
{
"data": [
{
"id": "0abcDEF1234567890xyzAB",
"status": "published",
"title": "Photography course",
"description": "Ten lessons to master your camera.",
"url": "https://pay.tallymark.com/p/0abcDEF1234567890xyzAB",
"image_url": null,
"file": {
"type": "url",
"url": "https://example.com/course.pdf",
"expires_at": null
},
"currency": "usd",
"language": "en",
"interval": null,
"amount": 10000,
"discounts": [],
"discount_amount": 0,
"taxable_amount": 10000,
"tax_rates": [],
"tax_amount": 0,
"total": 10000,
"accept_cards": true,
"custom_field": null,
"created_at": "2024-06-15T12:00:00.000000Z",
"updated_at": "2024-06-15T12:00:00.000000Z",
"is_deleted": false
}
],
"has_more": false,
"next_cursor": null
}Create a sales page
Creates a draft sales page, or a published one with
publish: true.
Request body
Send at most one discount.
- Name
publish- Type
- boolean
- Description
Create the sales page
publishedinstead ofdraft. Default:false.
- Name
title- Type
- string
- Required
- required
- Description
Also used as the item description on invoices. Max length 255.
- Name
description- Type
- string or null
- Name
amount- Type
- integer
- Required
- required
- Description
Price before discounts and taxes. Example:
10000. Min 0.
- Name
discounts- Type
- array of object
- Description
Max 1 items.
- Name
discounts[].amount- Type
- integer or null
- Description
Fixed amount off, in cents. Example:
10000. Min 0.
- Name
discounts[].percent- Type
- number or null
- Description
Percent off the subtotal, up to 4 decimals. Example:
12.5. Min 0. Max 100.
- Name
interval- Type
- string or null
- Description
Billing interval for subscriptions.
nullfor a one-time purchase. On create, omitting it also makes a one-time purchase; on update, omitting it keeps the current interval. One ofweekly,biweekly,four_weeks,monthly,eight_weeks,twelve_weeks,quarterly,biannual,yearly.
- Name
currency- Type
- string
- Required
- required
- Description
Three-letter currency code, in lowercase. Example:
usd.
- Name
language- Type
- string
- Required
- required
- Description
Two-letter language code, in lowercase. One of
da,en,fr,de,it,no,pt,es.
- Name
tax_rates- Type
- array of string
- Description
Tax rate IDs belonging to the account. Deleted tax rates cannot be added, but ones already on the sales page can be kept.
- Name
include_default_tax_rates- Type
- boolean
- Description
Adds the account's default tax rates on top of
tax_rates. On update, iftax_ratesis omitted, the defaults are added to the tax rates already on the sales page. A tax rate is never applied twice. Default:false.
- Name
accept_cards- Type
- boolean
- Required
- required
- Name
custom_field- Type
- object or null
- Description
Extra question asked to the buyer at checkout. On update, replaces the current custom field as a whole, and
nullremoves it.
- Name
custom_field.label- Type
- string
- Required
- required
- Description
Max length 255.
- Name
custom_field.description- Type
- string or null
- Name
custom_field.required- Type
- boolean
- Description
Whether the buyer must answer. Default:
false.
- Name
file- Type
- object or null
- Description
Digital product hosted elsewhere, given to the buyer after paying. Replaces the current file, including one uploaded in the app. On update,
nullremoves the current file.
- Name
file.url- Type
- string
- Required
- required
- Description
Max length 255.
Response
- Name
201- Description
Created sales page. Returns a sales page object.
Errors
- Name
400- Type
- request_failed
- Description
Your request could not be processed.
- Name
400- Type
- api_version_unsupported
- Description
The requested API version is not supported. Current version: 2026-08-21
- Name
401- Type
- api_key_missing
- Description
The API key is missing.
- Name
401- Type
- api_key_invalid
- Description
The API key is invalid or has been revoked.
- Name
403- Type
- api_key_read_only
- Description
This API key is read-only and cannot make write requests.
- Name
404- Description
The record doesn't exist or was deleted.
- Name
422- Description
The request body or query parameters are invalid.
- Name
429- Description
Too many requests. The limit is 300 requests per 5 minutes.
Request
curl -X POST https://api.tallymark.com/sales-pages \
-H "Authorization: Bearer $TALLYMARK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Photography course",
"description": "Ten lessons to master your camera.",
"amount": 10000,
"interval": null,
"currency": "usd",
"language": "en",
"accept_cards": true,
"file": {
"url": "https://example.com/course.pdf"
},
"publish": true
}'Response
{
"id": "0abcDEF1234567890xyzAB",
"status": "published",
"title": "Photography course",
"description": "Ten lessons to master your camera.",
"url": "https://pay.tallymark.com/p/0abcDEF1234567890xyzAB",
"image_url": null,
"file": {
"type": "url",
"url": "https://example.com/course.pdf",
"expires_at": null
},
"currency": "usd",
"language": "en",
"interval": null,
"amount": 10000,
"discounts": [],
"discount_amount": 0,
"taxable_amount": 10000,
"tax_rates": [],
"tax_amount": 0,
"total": 10000,
"accept_cards": true,
"custom_field": null,
"created_at": "2024-06-15T12:00:00.000000Z",
"updated_at": "2024-06-15T12:00:00.000000Z",
"is_deleted": false
}Show a sales page
Path parameters
- Name
id- Type
- string
- Required
- required
- Description
The sales page ID. Example:
0abcDEF1234567890xyzAB.
Response
- Name
200- Description
Sales page. Returns a sales page object.
Errors
- Name
400- Type
- request_failed
- Description
Your request could not be processed.
- Name
400- Type
- api_version_unsupported
- Description
The requested API version is not supported. Current version: 2026-08-21
- Name
401- Type
- api_key_missing
- Description
The API key is missing.
- Name
401- Type
- api_key_invalid
- Description
The API key is invalid or has been revoked.
- Name
404- Description
The record doesn't exist or was deleted.
- Name
429- Description
Too many requests. The limit is 300 requests per 5 minutes.
Request
curl https://api.tallymark.com/sales-pages/0abcDEF1234567890xyzAB \
-H "Authorization: Bearer $TALLYMARK_API_KEY"Response
{
"id": "0abcDEF1234567890xyzAB",
"status": "published",
"title": "Photography course",
"description": "Ten lessons to master your camera.",
"url": "https://pay.tallymark.com/p/0abcDEF1234567890xyzAB",
"image_url": null,
"file": {
"type": "url",
"url": "https://example.com/course.pdf",
"expires_at": null
},
"currency": "usd",
"language": "en",
"interval": null,
"amount": 10000,
"discounts": [],
"discount_amount": 0,
"taxable_amount": 10000,
"tax_rates": [],
"tax_amount": 0,
"total": 10000,
"accept_cards": true,
"custom_field": null,
"created_at": "2024-06-15T12:00:00.000000Z",
"updated_at": "2024-06-15T12:00:00.000000Z",
"is_deleted": false
}Update a sales page
Updates a sales page in any status. Only the fields you send are
changed; omitted fields keep their current value. Send null to
clear description, interval (makes it one-time), custom_field,
and file; send discounts: [] or tax_rates: [] to remove them.
Changes apply to purchases made from now on. To change the status, use
/publish and /unpublish.
Path parameters
- Name
id- Type
- string
- Required
- required
- Description
The sales page ID. Example:
0abcDEF1234567890xyzAB.
Request body
Send at most one discount.
- Name
title- Type
- string
- Description
Also used as the item description on invoices. Max length 255.
- Name
description- Type
- string or null
- Name
amount- Type
- integer
- Description
Price before discounts and taxes. Example:
10000. Min 0.
- Name
discounts- Type
- array of object
- Description
Max 1 items.
- Name
discounts[].amount- Type
- integer or null
- Description
Fixed amount off, in cents. Example:
10000. Min 0.
- Name
discounts[].percent- Type
- number or null
- Description
Percent off the subtotal, up to 4 decimals. Example:
12.5. Min 0. Max 100.
- Name
interval- Type
- string or null
- Description
Billing interval for subscriptions.
nullfor a one-time purchase. On create, omitting it also makes a one-time purchase; on update, omitting it keeps the current interval. One ofweekly,biweekly,four_weeks,monthly,eight_weeks,twelve_weeks,quarterly,biannual,yearly.
- Name
currency- Type
- string
- Description
Three-letter currency code, in lowercase. Example:
usd.
- Name
language- Type
- string
- Description
Two-letter language code, in lowercase. One of
da,en,fr,de,it,no,pt,es.
- Name
tax_rates- Type
- array of string
- Description
Tax rate IDs belonging to the account. Deleted tax rates cannot be added, but ones already on the sales page can be kept.
- Name
include_default_tax_rates- Type
- boolean
- Description
Adds the account's default tax rates on top of
tax_rates. On update, iftax_ratesis omitted, the defaults are added to the tax rates already on the sales page. A tax rate is never applied twice. Default:false.
- Name
accept_cards- Type
- boolean
- Name
custom_field- Type
- object or null
- Description
Extra question asked to the buyer at checkout. On update, replaces the current custom field as a whole, and
nullremoves it.
- Name
custom_field.label- Type
- string
- Required
- required
- Description
Max length 255.
- Name
custom_field.description- Type
- string or null
- Name
custom_field.required- Type
- boolean
- Description
Whether the buyer must answer. Default:
false.
- Name
file- Type
- object or null
- Description
Digital product hosted elsewhere, given to the buyer after paying. Replaces the current file, including one uploaded in the app. On update,
nullremoves the current file.
- Name
file.url- Type
- string
- Required
- required
- Description
Max length 255.
Response
- Name
200- Description
Updated sales page. Returns a sales page object.
Errors
- Name
400- Type
- request_failed
- Description
Your request could not be processed.
- Name
400- Type
- api_version_unsupported
- Description
The requested API version is not supported. Current version: 2026-08-21
- Name
401- Type
- api_key_missing
- Description
The API key is missing.
- Name
401- Type
- api_key_invalid
- Description
The API key is invalid or has been revoked.
- Name
403- Type
- api_key_read_only
- Description
This API key is read-only and cannot make write requests.
- Name
404- Description
The record doesn't exist or was deleted.
- Name
422- Description
The request body or query parameters are invalid.
- Name
429- Description
Too many requests. The limit is 300 requests per 5 minutes.
Request
curl -X POST https://api.tallymark.com/sales-pages/0abcDEF1234567890xyzAB/update \
-H "Authorization: Bearer $TALLYMARK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Photography masterclass",
"amount": 15000
}'Response
{
"id": "0abcDEF1234567890xyzAB",
"status": "published",
"title": "Photography course",
"description": "Ten lessons to master your camera.",
"url": "https://pay.tallymark.com/p/0abcDEF1234567890xyzAB",
"image_url": null,
"file": {
"type": "url",
"url": "https://example.com/course.pdf",
"expires_at": null
},
"currency": "usd",
"language": "en",
"interval": null,
"amount": 10000,
"discounts": [],
"discount_amount": 0,
"taxable_amount": 10000,
"tax_rates": [],
"tax_amount": 0,
"total": 10000,
"accept_cards": true,
"custom_field": null,
"created_at": "2024-06-15T12:00:00.000000Z",
"updated_at": "2024-06-15T12:00:00.000000Z",
"is_deleted": false
}Publish a sales page
Makes the sales page available to buy at its url.
Path parameters
- Name
id- Type
- string
- Required
- required
- Description
The sales page ID. Example:
0abcDEF1234567890xyzAB.
Response
- Name
200- Description
Published sales page. Returns a sales page object.
Errors
- Name
400- Type
- request_failed
- Description
Your request could not be processed.
- Name
400- Type
- api_version_unsupported
- Description
The requested API version is not supported. Current version: 2026-08-21
- Name
401- Type
- api_key_missing
- Description
The API key is missing.
- Name
401- Type
- api_key_invalid
- Description
The API key is invalid or has been revoked.
- Name
403- Type
- api_key_read_only
- Description
This API key is read-only and cannot make write requests.
- Name
404- Description
The record doesn't exist or was deleted.
- Name
429- Description
Too many requests. The limit is 300 requests per 5 minutes.
Request
curl -X POST https://api.tallymark.com/sales-pages/0abcDEF1234567890xyzAB/publish \
-H "Authorization: Bearer $TALLYMARK_API_KEY"Response
{
"id": "0abcDEF1234567890xyzAB",
"status": "published",
"title": "Photography course",
"description": "Ten lessons to master your camera.",
"url": "https://pay.tallymark.com/p/0abcDEF1234567890xyzAB",
"image_url": null,
"file": {
"type": "url",
"url": "https://example.com/course.pdf",
"expires_at": null
},
"currency": "usd",
"language": "en",
"interval": null,
"amount": 10000,
"discounts": [],
"discount_amount": 0,
"taxable_amount": 10000,
"tax_rates": [],
"tax_amount": 0,
"total": 10000,
"accept_cards": true,
"custom_field": null,
"created_at": "2024-06-15T12:00:00.000000Z",
"updated_at": "2024-06-15T12:00:00.000000Z",
"is_deleted": false
}Unpublish a sales page
Moves the sales page back to draft: it can no longer be bought.
Existing subscriptions created from it keep running.
Path parameters
- Name
id- Type
- string
- Required
- required
- Description
The sales page ID. Example:
0abcDEF1234567890xyzAB.
Response
- Name
200- Description
Draft sales page. Returns a sales page object.
Errors
- Name
400- Type
- request_failed
- Description
Your request could not be processed.
- Name
400- Type
- api_version_unsupported
- Description
The requested API version is not supported. Current version: 2026-08-21
- Name
401- Type
- api_key_missing
- Description
The API key is missing.
- Name
401- Type
- api_key_invalid
- Description
The API key is invalid or has been revoked.
- Name
403- Type
- api_key_read_only
- Description
This API key is read-only and cannot make write requests.
- Name
404- Description
The record doesn't exist or was deleted.
- Name
429- Description
Too many requests. The limit is 300 requests per 5 minutes.
Request
curl -X POST https://api.tallymark.com/sales-pages/0abcDEF1234567890xyzAB/unpublish \
-H "Authorization: Bearer $TALLYMARK_API_KEY"Response
{
"id": "0abcDEF1234567890xyzAB",
"status": "published",
"title": "Photography course",
"description": "Ten lessons to master your camera.",
"url": "https://pay.tallymark.com/p/0abcDEF1234567890xyzAB",
"image_url": null,
"file": {
"type": "url",
"url": "https://example.com/course.pdf",
"expires_at": null
},
"currency": "usd",
"language": "en",
"interval": null,
"amount": 10000,
"discounts": [],
"discount_amount": 0,
"taxable_amount": 10000,
"tax_rates": [],
"tax_amount": 0,
"total": 10000,
"accept_cards": true,
"custom_field": null,
"created_at": "2024-06-15T12:00:00.000000Z",
"updated_at": "2024-06-15T12:00:00.000000Z",
"is_deleted": false
}Delete a sales page
Deletes a sales page: it can no longer be bought. Invoices and subscriptions created from it are not affected. You can restore it later, with its status.
Path parameters
- Name
id- Type
- string
- Required
- required
- Description
The sales page ID. Example:
0abcDEF1234567890xyzAB.
Response
- Name
200- Description
Deleted sales page (
is_deletedtrue). Returns a sales page object.
Errors
- Name
400- Type
- request_failed
- Description
Your request could not be processed.
- Name
400- Type
- api_version_unsupported
- Description
The requested API version is not supported. Current version: 2026-08-21
- Name
401- Type
- api_key_missing
- Description
The API key is missing.
- Name
401- Type
- api_key_invalid
- Description
The API key is invalid or has been revoked.
- Name
403- Type
- api_key_read_only
- Description
This API key is read-only and cannot make write requests.
- Name
404- Description
The record doesn't exist or was deleted.
- Name
429- Description
Too many requests. The limit is 300 requests per 5 minutes.
Request
curl -X POST https://api.tallymark.com/sales-pages/0abcDEF1234567890xyzAB/delete \
-H "Authorization: Bearer $TALLYMARK_API_KEY"Response
{
"id": "0abcDEF1234567890xyzAB",
"status": "published",
"title": "Photography course",
"description": "Ten lessons to master your camera.",
"url": "https://pay.tallymark.com/p/0abcDEF1234567890xyzAB",
"image_url": null,
"file": {
"type": "url",
"url": "https://example.com/course.pdf",
"expires_at": null
},
"currency": "usd",
"language": "en",
"interval": null,
"amount": 10000,
"discounts": [],
"discount_amount": 0,
"taxable_amount": 10000,
"tax_rates": [],
"tax_amount": 0,
"total": 10000,
"accept_cards": true,
"custom_field": null,
"created_at": "2024-06-15T12:00:00.000000Z",
"updated_at": "2024-06-15T12:00:00.000000Z",
"is_deleted": false
}Restore a deleted sales page
Restores a deleted sales page with its status: a deleted published
sales page can be bought again right away.
Path parameters
- Name
id- Type
- string
- Required
- required
- Description
The sales page ID. Example:
0abcDEF1234567890xyzAB.
Response
- Name
200- Description
Restored sales page (
is_deletedfalse). Returns a sales page object.
Errors
- Name
400- Type
- request_failed
- Description
Your request could not be processed.
- Name
400- Type
- api_version_unsupported
- Description
The requested API version is not supported. Current version: 2026-08-21
- Name
401- Type
- api_key_missing
- Description
The API key is missing.
- Name
401- Type
- api_key_invalid
- Description
The API key is invalid or has been revoked.
- Name
403- Type
- api_key_read_only
- Description
This API key is read-only and cannot make write requests.
- Name
404- Description
The record doesn't exist or was deleted.
- Name
429- Description
Too many requests. The limit is 300 requests per 5 minutes.
Request
curl -X POST https://api.tallymark.com/sales-pages/0abcDEF1234567890xyzAB/restore \
-H "Authorization: Bearer $TALLYMARK_API_KEY"Response
{
"id": "0abcDEF1234567890xyzAB",
"status": "published",
"title": "Photography course",
"description": "Ten lessons to master your camera.",
"url": "https://pay.tallymark.com/p/0abcDEF1234567890xyzAB",
"image_url": null,
"file": {
"type": "url",
"url": "https://example.com/course.pdf",
"expires_at": null
},
"currency": "usd",
"language": "en",
"interval": null,
"amount": 10000,
"discounts": [],
"discount_amount": 0,
"taxable_amount": 10000,
"tax_rates": [],
"tax_amount": 0,
"total": 10000,
"accept_cards": true,
"custom_field": null,
"created_at": "2024-06-15T12:00:00.000000Z",
"updated_at": "2024-06-15T12:00:00.000000Z",
"is_deleted": false
}