curl --request POST \
--url https://sandbox.rx.tera.health/v1/enrollments/{enrollment_id}/injections \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"injected_at": "2026-10-26T08:00:00Z",
"scheduled_for": "2026-10-26",
"dose_mg": 0.5,
"site": "thigh_right",
"external_id": "inj-88213"
}
'const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
injected_at: '2026-10-26T08:00:00Z',
scheduled_for: '2026-10-26',
dose_mg: 0.5,
site: 'thigh_right',
external_id: 'inj-88213'
})
};
fetch('https://sandbox.rx.tera.health/v1/enrollments/{enrollment_id}/injections', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox.rx.tera.health/v1/enrollments/{enrollment_id}/injections"
payload = {
"injected_at": "2026-10-26T08:00:00Z",
"scheduled_for": "2026-10-26",
"dose_mg": 0.5,
"site": "thigh_right",
"external_id": "inj-88213"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "0190f5c9-8091-72a3-9dc5-4e5f60718293",
"external_id": "inj-88213",
"log_date": "2026-10-26",
"created_at": "2026-10-26T08:01:30Z",
"updated_at": "2026-10-26T08:01:30Z"
}Send an injection log
A dose taken or missed, as your app recorded it. A repeated external_id returns the first receipt with 200.
Scope: logs:write.
curl --request POST \
--url https://sandbox.rx.tera.health/v1/enrollments/{enrollment_id}/injections \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"injected_at": "2026-10-26T08:00:00Z",
"scheduled_for": "2026-10-26",
"dose_mg": 0.5,
"site": "thigh_right",
"external_id": "inj-88213"
}
'const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
injected_at: '2026-10-26T08:00:00Z',
scheduled_for: '2026-10-26',
dose_mg: 0.5,
site: 'thigh_right',
external_id: 'inj-88213'
})
};
fetch('https://sandbox.rx.tera.health/v1/enrollments/{enrollment_id}/injections', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sandbox.rx.tera.health/v1/enrollments/{enrollment_id}/injections"
payload = {
"injected_at": "2026-10-26T08:00:00Z",
"scheduled_for": "2026-10-26",
"dose_mg": 0.5,
"site": "thigh_right",
"external_id": "inj-88213"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "0190f5c9-8091-72a3-9dc5-4e5f60718293",
"external_id": "inj-88213",
"log_date": "2026-10-26",
"created_at": "2026-10-26T08:01:30Z",
"updated_at": "2026-10-26T08:01:30Z"
}Authorizations
A brand's server, one OAuth client per brand and environment. Get a token with the
client_credentials grant and send it as Authorization: Bearer <token>. Tokens last 1 hour.
A brand server reads status and ids only; it never reads clinical content. A platform partner holds one
client for all its brands and gets one token per brand, naming it with tenant_id.
Headers
A unique key per logical request, for example a UUID. Retrying with the same key and the same body
within 24 hours returns the first response (with Idempotent-Replayed: true) instead of creating a duplicate.
The same key with a different body is refused with 422 idempotency_key_reused.
8 - 255Path Parameters
Body
- Option 1
- Option 2
A dose taken (injected_at) or missed (missed: true). One of the two is required.
ISO 8601 in UTC.
"2026-10-26T14:05:00Z"
Your own identifier, printable ASCII without spaces.
1 - 128^[\x21-\x7E]+$"inj-88213"
"2026-10-26"
0.5
For example abdomen_left, abdomen_right, thigh_left, thigh_right, arm_left, arm_right.
"abdomen_left"
1000"Slight redness at site"
Response
Already received; the first receipt.
What a brand server gets back for a log. The values stay with the care team.
"0190f5c9-5d6e-7f70-8a92-1b2c3d4e5f60"
Your own identifier, printable ASCII without spaces.
1 - 128^[\x21-\x7E]+$"meal-77120"
A calendar date in the patient's time zone.
"2026-10-26"
ISO 8601 in UTC.
"2026-10-26T14:05:00Z"
When the log was last corrected; the same as created_at until then.
"2026-10-26T14:05:00Z"

