/v1/service_variantsCreate a ServiceVariant
Creates a ServiceVariant on an existing Service. net_price uses minor currency units. The response is the parent Service. Requires services.create.
Required API scopes: services.create
Parameters
Idempotency-Key
header · required
string
Client-generated idempotency key. Required for every POST/PATCH write. Replay of the same key with the same body returns the stored response with an
Idempotency-Replayed: trueheader. Same key + different body returns422 idempotency_key_reused. A duplicate that arrives while the first request is still in flight returns409 idempotency_conflictwithRetry-After: 1.
Request body
application/json
clinician_idstring | null · uuidThe Clinician assigned to this ServiceVariant, when the variant is clinician-specific.
currencystring | nullThe ISO 4217 currency code used for this ServiceVariant.
Allowed values:
chf | eur | gbp | usd | nulldescriptionstring | nullThe description of this ServiceVariant.
location_idstring · uuidrequiredThe Location assigned to this ServiceVariant. Required when creating a variant.
net_priceintegerrequiredThe net price in minor currency units, before tax.
permits_remote_bookingsbooleanWhether this ServiceVariant can be used for remote bookings.
service_idstring · uuidrequiredThe Service this variant belongs to. Required when creating a variant.
Responses
The requested Service.
created_atstring · date-timerequiredAn ISO 8601 timestamp in UTC, with a
Zsuffix. For example,2026-07-01T09:00:00Z.descriptionstring | nullrequiredThe description of the service shown to staff members and patients.
duration_minutesinteger | nullrequiredThe scheduled duration of the service, in minutes.
idstring · uuidrequiredThe resource's unique identifier, formatted as an RFC 4122 version 4 UUID.
is_bookable_onlinebooleanrequiredWhether patients can book this service online in the Patient Portal.
namestringrequiredThe display name of the service.
objectanyrequiredDiscriminator value emitted at
object.service_variantsarrayrequiredThe bookable variants of this service.
itemsobjectclinician_idstring | null · uuidrequiredThe identifier of the clinician assigned to this service variant, when the variant is clinician-specific.
currencystring | nullrequiredThe ISO 4217 currency code used for this service variant. Must be one of
chf,eur,gbp, orusd.descriptionstring | nullrequiredThe description of this service variant.
idstring · uuidrequiredThe resource's unique identifier, formatted as an RFC 4122 version 4 UUID.
linksobjectrequiredURLs to related resources.
clinicianstring | null · urirequiredThe full URL of a related resource.
locationstring | null · urirequiredThe full URL of a related resource.
location_idstring | null · uuidrequiredThe identifier of the location assigned to this service variant, when the variant is location-specific.
net_priceinteger | nullrequiredThe net price of this service variant, before tax, in the currency's minor units.
permits_remote_bookingsbooleanrequiredWhether this service variant can be used for remote bookings.
tax_rateobject | nullrequiredThe tax rate applied to this service. Null when no tax rate is set.
descriptionstring | nullrequiredThe description of when the tax rate applies.
idstring · uuidrequiredThe resource's unique identifier, formatted as an RFC 4122 version 4 UUID.
percentagenumberrequiredThe tax rate as a percentage from 0 to 100.
titlestringrequiredThe display name of the tax rate, for example
20% VAT.
updated_atstring · date-timerequiredAn ISO 8601 timestamp in UTC, with a
Zsuffix. For example,2026-07-01T09:00:00Z.
Example
{
"id": "00000000-0000-4000-8000-000000000005",
"object": "service",
"created_at": "2026-01-01T09:00:00Z",
"description": "An initial consultation at the Harley Street Clinic.",
"duration_minutes": 30,
"is_bookable_online": true,
"name": "Initial consultation",
"service_variants":
"id": "00000000-0000-4000-8000-000000000006",
"clinician_id": "00000000-0000-4000-8000-000000000002",
"currency": "GBP",
"description": "An initial consultation at the Harley Street Clinic.",
"links":
"clinician": "https://api.carebit.co/v1/clinicians/00000000-0000-4000-8000-000000000002",
"location": "https://api.carebit.co/v1/locations/00000000-0000-4000-8000-000000000003"
},
"location_id": "00000000-0000-4000-8000-000000000003",
"net_price": 1,
"permits_remote_bookings": true
}
],
"tax_rate":
"id": "00000000-0000-4000-8000-000000000029",
"description": "An initial consultation at the Harley Street Clinic.",
"percentage": 20,
"title": "VAT"
},
"updated_at": "2026-01-01T09:00:00Z"
}The Idempotency-Key header is missing (idempotency_key_required) or exceeds 255 characters (idempotency_key_too_long).
errorobjectrequiredThe structured details that describe why the request failed.
codestringrequiredThe machine-readable error code.
errorsarray | nullAdditional errors from a failed validation.
itemsobjectcodestringThe machine-readable code for this validation error.
messagestringA message that explains this validation error.
paramstring | nullThe name of the parameter that caused this validation error, when known.
messagestringrequiredA message that explains the error and how to resolve it.
paramstring | nullThe name of the parameter that caused the error, when known.
typestringrequiredThe high-level category of the error.
Allowed values:
authentication_error | permission_error | invalid_request_error | rate_limit_error | api_error
Example
{
"error":
"code": "resource_missing",
"errors":
"code": "resource_missing",
"message": "The requested resource was not found.",
"param": "patient_id"
}
],
"message": "The requested resource was not found.",
"param": "patient_id",
"type": "authentication_error"
}
}The access token is missing, invalid, expired, or revoked.
errorobjectrequiredThe structured details that describe why the request failed.
codestringrequiredThe machine-readable error code.
errorsarray | nullAdditional errors from a failed validation.
itemsobjectcodestringThe machine-readable code for this validation error.
messagestringA message that explains this validation error.
paramstring | nullThe name of the parameter that caused this validation error, when known.
messagestringrequiredA message that explains the error and how to resolve it.
paramstring | nullThe name of the parameter that caused the error, when known.
typestringrequiredThe high-level category of the error.
Allowed values:
authentication_error | permission_error | invalid_request_error | rate_limit_error | api_error
Example
{
"error":
"code": "resource_missing",
"errors":
"code": "resource_missing",
"message": "The requested resource was not found.",
"param": "patient_id"
}
],
"message": "The requested resource was not found.",
"param": "patient_id",
"type": "authentication_error"
}
}The access token lacks the required scope, or the project is disabled.
errorobjectrequiredThe structured details that describe why the request failed.
codestringrequiredThe machine-readable error code.
errorsarray | nullAdditional errors from a failed validation.
itemsobjectcodestringThe machine-readable code for this validation error.
messagestringA message that explains this validation error.
paramstring | nullThe name of the parameter that caused this validation error, when known.
messagestringrequiredA message that explains the error and how to resolve it.
paramstring | nullThe name of the parameter that caused the error, when known.
typestringrequiredThe high-level category of the error.
Allowed values:
authentication_error | permission_error | invalid_request_error | rate_limit_error | api_error
Example
{
"error":
"code": "resource_missing",
"errors":
"code": "resource_missing",
"message": "The requested resource was not found.",
"param": "patient_id"
}
],
"message": "The requested resource was not found.",
"param": "patient_id",
"type": "authentication_error"
}
}The Service, Location, or Clinician was not found in the Organization.
errorobjectrequiredThe structured details that describe why the request failed.
codestringrequiredThe machine-readable error code.
errorsarray | nullAdditional errors from a failed validation.
itemsobjectcodestringThe machine-readable code for this validation error.
messagestringA message that explains this validation error.
paramstring | nullThe name of the parameter that caused this validation error, when known.
messagestringrequiredA message that explains the error and how to resolve it.
paramstring | nullThe name of the parameter that caused the error, when known.
typestringrequiredThe high-level category of the error.
Allowed values:
authentication_error | permission_error | invalid_request_error | rate_limit_error | api_error
Example
{
"error":
"code": "resource_missing",
"errors":
"code": "resource_missing",
"message": "The requested resource was not found.",
"param": "patient_id"
}
],
"message": "The requested resource was not found.",
"param": "patient_id",
"type": "authentication_error"
}
}A concurrent request holds the idempotency lease (idempotency_conflict). Retry after the delay indicated by Retry-After.
errorobjectrequiredThe structured details that describe why the request failed.
codestringrequiredThe machine-readable error code.
errorsarray | nullAdditional errors from a failed validation.
itemsobjectcodestringThe machine-readable code for this validation error.
messagestringA message that explains this validation error.
paramstring | nullThe name of the parameter that caused this validation error, when known.
messagestringrequiredA message that explains the error and how to resolve it.
paramstring | nullThe name of the parameter that caused the error, when known.
typestringrequiredThe high-level category of the error.
Allowed values:
authentication_error | permission_error | invalid_request_error | rate_limit_error | api_error
Example
{
"error":
"code": "resource_missing",
"errors":
"code": "resource_missing",
"message": "The requested resource was not found.",
"param": "patient_id"
}
],
"message": "The requested resource was not found.",
"param": "patient_id",
"type": "authentication_error"
}
}The Idempotency-Key was previously used with a different request body (idempotency_key_reused), or the request body failed validation.
errorobjectrequiredThe structured details that describe why the request failed.
codestringrequiredThe machine-readable error code.
errorsarray | nullAdditional errors from a failed validation.
itemsobjectcodestringThe machine-readable code for this validation error.
messagestringA message that explains this validation error.
paramstring | nullThe name of the parameter that caused this validation error, when known.
messagestringrequiredA message that explains the error and how to resolve it.
paramstring | nullThe name of the parameter that caused the error, when known.
typestringrequiredThe high-level category of the error.
Allowed values:
authentication_error | permission_error | invalid_request_error | rate_limit_error | api_error
Example
{
"error":
"code": "resource_missing",
"errors":
"code": "resource_missing",
"message": "The requested resource was not found.",
"param": "patient_id"
}
],
"message": "The requested resource was not found.",
"param": "patient_id",
"type": "authentication_error"
}
}Too many requests. Retry after the delay indicated by Retry-After.
errorobjectrequiredThe structured details that describe why the request failed.
codestringrequiredThe machine-readable error code.
errorsarray | nullAdditional errors from a failed validation.
itemsobjectcodestringThe machine-readable code for this validation error.
messagestringA message that explains this validation error.
paramstring | nullThe name of the parameter that caused this validation error, when known.
messagestringrequiredA message that explains the error and how to resolve it.
paramstring | nullThe name of the parameter that caused the error, when known.
typestringrequiredThe high-level category of the error.
Allowed values:
authentication_error | permission_error | invalid_request_error | rate_limit_error | api_error
Example
{
"error":
"code": "resource_missing",
"errors":
"code": "resource_missing",
"message": "The requested resource was not found.",
"param": "patient_id"
}
],
"message": "The requested resource was not found.",
"param": "patient_id",
"type": "authentication_error"
}
}