No Abstractions: our API design principle
Perceived value of a “no‑abstractions” payments API
- Some see strong value in a provider that exposes underlying payment rails (ACH, card networks) without inventing new concepts.
- Others argue that if the API mirrors underlying services too closely, it risks being “just a middleman” unless it clearly adds value (e.g., licensing, infra, unified access).
- Several comments stress that avoiding direct integrations with networks like ACH, Visa/Mastercard, or international rails is already a major value-add, given their archaic tech (batch files, FTP, CSV workflows) and complex business relationships.
What “no abstractions” actually means
- Interpreted as:
- Use the networks’ own terminology and structures.
- Model resources on real network messages/events.
- Avoid “unifying” different schemes into a single generic object unless absolutely necessary.
- Many point out this is still an abstraction choice, just “abstraction-light” or “fewer generalizations.”
Comparison to Stripe’s higher-level model
- Stripe is praised for simplicity and polish but criticized for “leaky abstractions”:
- Different behavior of SetupIntents by payment method/region.
- Disputes, fees, authorization/capture windows differing per rail.
- Connect transfers behaving differently across countries.
- Takeaway: you must still understand underlying payment specifics; a uniform surface can mislead.
Low-level vs high-level APIs
- Strong support for offering both:
- A low-level, network-faithful API for experts.
- A higher-level, convenience API for common use cases, possibly built on top.
- Examples referenced: git “plumbing vs porcelain,” filesystems, graphics APIs, Kubernetes, .NET, etc.
- Tradeoffs noted: larger surface area, potential state mismatches, but better ergonomics.
Domain language and DDD
- Multiple comments connect this approach to Domain-Driven Design’s “ubiquitous language”: use the same terms domain experts already use.
- For this product, the “domain” appears to be the payment networks themselves, which suits users who are payments specialists more than generalist app developers.
Money representation in APIs
- Wide agreement: do not use floats for currency.
- Suggested patterns:
- Integers in “minor units” (cents, fils, etc.), or higher multipliers for more precision.
- Fixed-point or decimal/bigdecimal types.
- JSON numeric parsing pitfalls in JavaScript are discussed; some argue JSON numbers are abstract and can be parsed into precise types.
Skepticism and naming
- Several commenters find “No Abstractions” a misleading or marketing-ish title; they prefer framings like “carefully scoped abstractions” or “minimize generalization.”
- Concerns raised about tight coupling to external specs: if network specs evolve, APIs may require versioning and added maintenance complexity.