Change a repeating visit from a date onwards
PATCH/api/v1/visit_series/{id}
"This and future visits". Scheduled visits of the series from effective_from (default today) are replaced; earlier visits and visits that have started are kept. Without starts_on the existing rhythm continues from effective_from; with it, starts_on becomes the first new visit. A season is kept unless both of its months are sent: two months change it, and two nulls make the series run all year.
- Needs an API key, and runs with the access of the member who made the key.
- Send an
Idempotency-Key. The same key with the same request within 24 hours gives the first answer again and changes nothing. - A connected AI assistant can use it too, as
updateVisitSeries.
Parameters
In the address
idstring (uuid)required
In the query string
effective_fromstring (date)First date (in the series' time zone) the change applies to.
Headers
Idempotency-KeystringrequiredUnique user-scoped key for safely retrying this mutation for 24 hours.
At least 1 character. Up to 200 characters.
Request body
Sent as application/json.
visit_seriesobjectrequiredFields(12)
lock_versionintegerAt least 0.
intervalintegerAt least 1. At most 99.
unitstring`weekday` is Monday to Friday, one visit per working day, and needs an interval of 1.
One of: day, weekday, week, month.
occurrencesintegerEnd after this many visits from `starts_on`; dates outside a season are not counted. Stored as `ends_on`.
At least 1. At most 500. Write only.
starts_onstring (date)Date of the first visit. Weekly rhythms repeat on its weekday and monthly ones on its day of the month.
ends_onstring (date) or nullLast date a visit may fall on.
season_from_monthinteger or null`season_from_month` and `season_to_month` are the first and last month of the part of the year a series runs in, 1 for January to 12 for December, both included. Give both or neither. A season may run over the year end: 11 and 2 is November to February. Dates outside it are skipped; the rhythm is not restarted.
At least 1. At most 12.
season_to_monthinteger or null`season_from_month` and `season_to_month` are the first and last month of the part of the year a series runs in, 1 for January to 12 for December, both included. Give both or neither. A season may run over the year end: 11 and 2 is November to February. Dates outside it are skipped; the rhythm is not restarted.
At least 1. At most 12.
start_timestringLocal time in the account's time zone.
Matches ^([01][0-9]|2[0-3]):[0-5][0-9]$.
duration_minutesintegerAt least 1. At most 1440.
instructionsstring or nullmembership_idsarray of string (uuid)
Responses
200A repeating visit.
dataobjectrequiredFields(18)
lock_versionintegerrequiredAt least 0.
created_atstring (date-time)requiredupdated_atstring (date-time)requiredidstring (uuid)requiredaccount_idstring (uuid)requiredjob_idstring (uuid)requiredintervalintegerrequiredAt least 1. At most 99.
unitstringrequired`weekday` is Monday to Friday, one visit per working day, and needs an interval of 1.
One of: day, weekday, week, month.
starts_onstring (date)requiredends_onstring (date) or nullseason_from_monthinteger or null`season_from_month` and `season_to_month` are the first and last month of the part of the year a series runs in, 1 for January to 12 for December, both included. Give both or neither. A season may run over the year end: 11 and 2 is November to February. Dates outside it are skipped; the rhythm is not restarted.
At least 1. At most 12.
season_to_monthinteger or null`season_from_month` and `season_to_month` are the first and last month of the part of the year a series runs in, 1 for January to 12 for December, both included. Give both or neither. A season may run over the year end: 11 and 2 is November to February. Dates outside it are skipped; the rhythm is not restarted.
At least 1. At most 12.
start_timestringrequiredduration_minutesintegerrequiredtime_zonestringrequiredinstructionsstring or nullmembership_idsarray of string (uuid)requiredgenerated_throughstring (date) or nullVisits exist up to this date.
A refusal answers in the one error shape every operation shares.
Example
A request our own tests send. The ids are made up: put your own in their place.
curl -X PATCH "https://app.tradesender.co.uk/api/v1/visit_series/80614f58-0641-5432-97ed-556ec96e9785?effective_from=2026-11-02" \
-H "Authorization: Bearer $TRADESENDER_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"visit_series": {
"start_time": "14:30",
"lock_version": "1"
}
}'