Undocumented API?
Document it, field by field.

Turn a raw JSON response into a record of what every field actually means — including the ones you still have questions about.

Free · open source · runs in your browser · notes export as JSON

openalex-work 521 crossref-work 208 + features 3
559 keys · 38 marked · 521 untriaged alluntriaged *?
display_name: "The state of OA: a large-scale analysis…" * ? – the title @citation-row
publication_year: 2018
fwci: 544.7065 * ? – field-weighted citation impact? scale?
is_paratext: false
is_retracted: false
▸ primary_location { } * ? – vs best_oa_location vs locations[] — which is canonical?
▾ authorships [ ]
▾ [0] { }
author_position: "first" * ? – first | middle | last
▾ institutions [ ]
ror: "https://ror.org/0293rh114" * ? – Research Organization Registry id — stable?
raw_affiliation_string: ""
+ 8 more items
▸ abstract_inverted_index { } * ? – word → positions, not text — 167 keys dismissed
i interesting q question x ignore j k moveh l fold ⏎ note/ search

One click settles a whole section

Ignore a container and everything inside it stops counting.

▾ abstract_inverted_index { } * ? –
"Despite": [0] –
"growing": [1] –
"interest": [2] –
untriaged 559 → 392

Half the output is questions

Filter to ? and you have the list to send the vendor.

alluntriaged *?
fwci what scale? no unit given
primary_location vs best_oa_location — canonical?
institutions[].ror stable identifier we can key on?
apc_paid who paid — author or funder?

Can I build it with this?

Tag keys with @feature and see where you stand.

missing @retraction-notice
unresolved @canonical-pdf-link
covered @citation-row
covered @author-list

Describe the shape, not every copy

Nine repeated records are one thing to document, not nine.

authorships[0].institutions[2].ror
↓
authorships[].institutions[].ror

Never leave the keyboard

Sweep a thousand keys without reaching for the mouse.

jkhl iqx ⏎y/ gG[]

Built for the big ones

A 1,150-key payload stays instant — ~50 rows ever reach the DOM.

payload 1,150 keys
in the DOM 54 rows
per keystroke 0.17 ms

Your payloads never leave the browser

There is no server. The app ships a policy that blocks network requests outright — check it yourself in devtools.

> fetch('https://example.com')
✗ Refused to connect — Content-Security-Policy: connect-src 'none'
> indexedDB.databases()
✓ [{ name: 'json-notes' }]

Browser-only, not browser-trapped

One ↓ export button, one file, and you can drop it back on any browser on any machine. That is also how a teammate gets the field docs.

  • Everything in one file — payloads, notes, marks and features. It carries whatever customer data your samples did, so treat it that way.
  • Drop it back on the window and the lot comes back, payloads included — the person you sent it to needs nothing else.
  • Notes key on payload name and normalized path, so an imported bundle lands back on the same fields.
  • Imports merge and existing notes win — an old backup cannot overwrite newer work.
  • Browsers evict site data under pressure, which is why the button is in the toolbar and not buried in a menu.
openalex-work 521 ↓ export ⋯
json-notes-2026-08-10.json
every payload · every mark, note and feature
drop it back on the window to restore all of it