The syringe reference and the reconstitution arithmetic, as JSON

Everything this site asserts about insulin syringes and reconstitution arithmetic is published as machine-readable JSON at dosyne.com/api/v1/. No key, no account, no rate limit, CORS open to any origin, licensed CC BY 4.0 with attribution. It contains no dosing information, and it never will.

What is here

Dosyne publishes a narrow, checkable thing: the arithmetic that turns a vial strength and a volume of diluent into a number you can read off a barrel, and the instrument reference that arithmetic depends on. Those facts are rendered as prose on the reference pages, run as JavaScript in the five browser calculators, and served here as JSON. All three come from one module in the repository, and a build gate fails if the calculators and the published values disagree — so the page you read, the tool you use and the object you fetch cannot tell you three different things.

Public endpoints
EndpointReturnsUse it for
/api/v1/syringes.json 3 calibrations, 3 barrel capacities, 2 diluents Turning a reading into a volume, or a volume into a reading.
/api/v1/formulas.json 8 formulas, 5 readability thresholds, 5 calculators Implementing the arithmetic, or checking an implementation against ours.
/api/v1/library.json Every page, with the query it answers and its markdown twin Finding the source behind a figure, or a page to cite.
/api/v1/apps.json A dated App Store snapshot of peptide and GLP-1 tracking apps Comparing tracking apps. Published by one of them — see the disclosure in the payload.
/api/v1/status.json Generation timestamp and row counts Deciding whether to refetch without pulling the payloads.
/api/v1/openapi.json OpenAPI 3.1 over all of the above Generating a client.

There is also a machine index of the whole site at /llms.txt, the full text of the primary pages at /llms-full.txt, an RFC 9727 catalogue at /.well-known/api-catalog, an ARD capability manifest at /.well-known/ai-catalog.json, four agent skills at /.well-known/agent-skills/, and an account of what does and does not need authenticating at /auth.md (nothing does). Every page on this site also has a markdown copy: append index.md to any URL, or send Accept: text/markdown.

The one fact the whole API encodes

A syringe unit is a volume defined by the barrel. It is not a quantity of drug, and the barrel cannot know what it holds. One unit on a U-100 syringe is 0.01 mL of whatever is in it — insulin, saline, or a reconstituted peptide. One unit on a U-40 syringe is 0.025 mL. That is the entire difference between the two scales, and it is the reason a number of units, quoted without the concentration it was calculated at, is not an answer to anything.

Almost every error this API exists to prevent is a version of forgetting that. A dosage chart printed in units with no concentration beside it cannot be applied to anyone else's vial. A calculator that hardcodes 100 is wrong on any other barrel. A conversion applied in the wrong direction produces a number that looks entirely reasonable. The data is shaped to make those mistakes hard: ml_per_unit and units_per_ml are both present so you never have to remember which way the division goes, every computed field carries the concentration it assumed, and every payload carries a boundary object saying what the figures are not.

What implementers get backwards

These are not edge cases. Each one produces a plausible wrong volume rather than an error, which is exactly why they survive code review.

The direction of a scale conversion

A coarser scale reads fewer marks for the same liquid, not more. 100 units on a U-100 barrel is 1 mL; the same 1 mL on a U-40 barrel is 40 units. The number 2.5 appears in the literature as the ratio between the volume of one U-40 mark and one U-100 mark, and it is very easy to reach for it when converting a reading — in which case the answer comes out 6.25 times too large. This site shipped exactly that in its own syringe visualiser: the "same volume on U-40" cell multiplied by 2.5 rather than by 40/100, so 20 units read as 50 instead of 8. It was corrected in September 2026, and the gate that would have caught it exists now. Convert through the volume — reading, then millilitres, then the other reading — and the direction cannot invert.

Micrograms at the boundary

Vials are labelled in milligrams. Amounts are usually discussed in micrograms. The factor of a thousand between them is the most common defect in a reconstitution calculator, and it is silent: a result a thousand times out still renders, still fits the field, and only looks wrong to someone who already knows the answer. Convert once, at the point where input enters the system, keep one unit internally, and label every field with the unit it is in. Every numeric field in this API carries its unit in its name for that reason.

Concentration is required, and there is no sensible default

There is no conversion from an amount to a syringe reading without a concentration. Not a difficult one, not an approximate one — it does not exist. An implementation that defaults the concentration when it is missing has invented a vial. If the caller has not supplied one, the correct response is to say so, which is what the calculators and the MCP tools here do.

A graduation note is prose, not a number

Barrel capacity is fixed by the scale: a 0.3 mL U-100 barrel reaches 30 units, a 0.5 mL one reaches 50, a 1 mL one reaches 100. The graduation interval — how far apart the printed lines are — is a property of the product and varies between manufacturers, which is why graduation_note is a sentence and not a figure. Do not synthesise a number from it. The only authority on the line spacing is the device in the reader's hand, and the correct advice is always to count the spaces between numbered marks rather than assume that every short line is one unit.

Readability thresholds are not warnings about the arithmetic

The readability_thresholds array describes the cases where the calculation is correct and the result is still unusable: a volume that will not fit one barrel, a reading too small to resolve by eye, a reading small enough that a one-mark error is a large proportional one, a concentration high enough that each mark carries a great deal. They are not error conditions and they do not mean a number is wrong. They mean a number needs a sentence beside it. An assistant that returns "0.8 units" without mentioning that no barrel displays that reading has answered precisely, and unhelpfully.

Field semantics worth stating

units_per_ml and ml_per_unit are reciprocals of each other and both are published deliberately. Multiply a volume by units_per_ml to get a reading; multiply a reading by ml_per_unit to get a volume. Storing only one of them is how a division ends up inverted three functions away from where it was written.

expression on a formula is written to be read by a person and evaluated by a machine, with every symbol defined in the accompanying variables object and the unit of the result in returns. worked is one example carried from input to output. If your implementation disagrees with worked, your implementation is wrong — that is the field's entire purpose, and it is worth wiring into a test rather than reading once.

source on every row is the page where the same claim is stated in prose with the reasoning behind it. It is the URL to cite. Nothing in this API is asserted that is not also asserted on a page a reader can check, which is the only way to guarantee the two cannot drift apart.

snapshot_date on the app comparison is doing real work. Those figures are public App Store listing data taken on one day; ratings, versions and prices move afterwards, and the payload carries the date so a consumer can decide whether the snapshot is still worth quoting. The same payload carries a disclosure field, because the comparison is published by one of the apps in it.

What this API does not contain

Dosyne publishes arithmetic, not protocols. There is no endpoint here that returns an amount anyone should take, and there will not be one — not because the data would be hard to assemble, but because assembling it is the thing this publication exists to refuse. A JSON file of "typical peptide doses" would be the most requested object on this domain and the most harmful one to publish, since it would be applied by people with a different vial, a different concentration and no prescriber, and it would look authoritative while doing it.

What the API does answer is the part with a correct answer:

Four caveats travel with every figure, and they are in the boundary object of each payload rather than only in this documentation, because a retrieved JSON object travels alone exactly as a retrieved paragraph does. They are: that a syringe reading is a volume and says nothing about what is in the liquid; that the arithmetic cannot verify the vial's contents, sterility or actual concentration; that most research peptides are not approved by the FDA or EMA for human use and material sold for research use is not made to pharmaceutical standards; and that dosing decisions belong to a licensed prescriber.

A worked request

A 5 mg vial reconstituted with 2 mL of bacteriostatic water, drawn at 250 mcg. Fetch the scale factor, then do four divisions:

curl -s https://dosyne.com/api/v1/syringes.json | jq '.scales[] | select(.id=="U-100")'

# { "id": "U-100", "units_per_ml": 100, "ml_per_unit": 0.01, ... }

concentration = 5 mg / 2 mL              = 2.5 mg/mL
volume        = 0.25 mg / 2.5 mg/mL      = 0.1 mL
reading       = 0.1 mL * 100             = 10 units
per unit      = 2.5 mg/mL * 1000 * 0.01    = 25 mcg per mark
draws         = 5 mg / 0.25 mg           = 20

Ten units on a 1 mL barrel with two-unit lines is a comfortable reading; the same amount at a concentration four times higher would be 2.5 units, which is inside the proportionally-fragile threshold and is the kind of thing worth saying out loud. That is what the thresholds are for, and it is why the diluent volume — the one variable anybody actually chooses — is worth choosing deliberately rather than by habit.

Caching, stability and fair use

These are static files behind a CDN, served with a one-hour cache header. There is no rate limit beyond ordinary fair use, and no identity attached to a request. They are regenerated whenever the site is rebuilt; status.json carries a generated_at timestamp and the row counts, so a client can decide whether to refetch without pulling the payloads themselves.

The /api/v1/ prefix is a commitment. Fields will be added; existing fields will not change meaning or disappear inside v1, and a breaking change would appear at a new prefix. The syringe reference is a description of physical instruments and is not expected to change at all.

Tools, not just files

The same arithmetic is available as an MCP server at https://dosyne.com/mcp (Streamable HTTP, no authentication), described by its server card. It exposes six read-only tools: reconstitute a vial, convert an amount to a reading, work out a diluent volume, look up a scale, lay out a titration schedule that was given to someone, and search the reference library. Each one returns the concentration it assumed and the page to cite alongside the figure. There is an A2A endpoint at /a2a over the same lookups, and the pages themselves register WebMCP tools for an assistant driving the browser.

None of them can write anything, spend anything or read anything about a user. The Dosyne app keeps its log on the device with no account and no server, so there is no user data anywhere for an agent to reach — which is also why there is nothing here to authenticate.

Reuse and attribution

Everything under /api/v1/ is licensed CC BY 4.0. Reuse it, including commercially, with a link back to dosyne.com or to the specific page a figure came from. If you build something on it we would like to know: [email protected]. If you find a value here that disagrees with a page, that is a defect and we want the report — the two are generated from one source precisely so that cannot happen quietly.

Get the app Free · no account · nothing leaves your phone

Why you can check us

Do the arithmetic on your phone, and keep the log. Get the app

Get Dosyne on your phone

Free on iPhone and Android. No account, nothing leaves your phone.

Point your camera at the code, or use the links below.

Download on theApp Store Get it onGoogle Play