Paddle
Merchant of record and billing for software companies.
Overall score
58.7/100
paddle-rest-v1
Measured Oct 5, 2026
Status
Ranked
Complete benchmark. `overall` is a weighted average of the applicable criteria, comparable to other surfaces in the same category and the same rubric version.
Coverage
77% of the rubric
Surfaces
evaluated.
We score a surface, not a product. One product often exposes several, and they are not worth the same.
paddle-rest-v1restprimary
77% coverage
58.7/100
Criterion
by criterion.
Measured on paddle-rest-v1, rubric v0.2.0. A criterion with no score is not counted as zero: it is excluded and the weights are renormalised.
Offload Valuejudged · weight 15 · Oct 5, 2026
92/100
Paddle is a merchant-of-record payments/billing API: it performs real side effects (charging customers, creating transactions, subscriptions, refunds/adjustments, credit notes, PDF invoices) and handles proprietary/compliance work an agent cannot simulate — tax-inclusive pricing previews, country/currency data, subscription proration previews, MRR and revenue metrics. None of this is reproducible via inference; it moves money and produces legally binding documents.
- https://developer.paddle.com/api-reference/overview
Create a one-time charge for a subscription Pause a subscription Resume a paused subscription Preview an update to a subscription
- https://developer.paddle.com/api-reference/overview
Create a one-time charge for a subscription Pause a subscription Resume a paused subscription Preview an update to a subscription
- https://developer.paddle.com/api-reference/overview
Create a one-time charge for a subscription Pause a subscription Resume a paused subscription Preview an update to a subscription
Interaction Costmeasured · weight 15
—/100
How many tokens does it cost me just to TALK to this API to complete its category's canonical task?
Error Recoverabilityprobed · weight 15 · Oct 5, 2026
63/100
unknown_endpoint → HTTP 404, clarity 60/100 (field named: no, allowed values: yes, RFC 9457: no) · wrong_type → HTTP 400, clarity 80/100 (field named: yes, allowed values: yes, RFC 9457: no) · hallucinated_enum → HTTP 400, clarity 55/100 (field named: no, allowed values: yes, RFC 9457: no) · unknown_field → HTTP 200, clarity 65/100 (field named: yes, allowed values: no, RFC 9457: no) · missing_required_param → HTTP 400, clarity 55/100 (field named: no, allowed values: yes, RFC 9457: no) · idempotency_replay → HTTP 201, clarity 30/100 (field named: no, allowed values: no, RFC 9457: no)
- https://sandbox-api.paddle.com/products
HTTP 403: {"error":{"type":"request_error","code":"forbidden","detail":"You aren't permitted to perform this request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/forbidden"},"meta":{"req
- https://sandbox-api.paddle.com/products/nonexistent_resource_xyz
HTTP 404: {"error":{"type":"request_error","code":"invalid_url","detail":"URL called is invalid.","documentation_url":"https://developer.paddle.com/v1/errors/shared/invalid_url"},"meta":{"request_id":"947b5a91-
- https://sandbox-api.paddle.com/products?per_page=not_a_number
HTTP 400: {"error":{"type":"request_error","code":"bad_request","detail":"Invalid request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/bad_request","errors":[{"field":"per_page","message
- https://sandbox-api.paddle.com/products?status=nonexistent_status
HTTP 400: {"error":{"type":"request_error","code":"bad_request","detail":"Invalid request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/bad_request","errors":[{"field":"status[0]","messag
Doc Legibilitymeasured · weight 12 · Oct 5, 2026
17/100
text/markup ratio 3.3% (weight 30) · rendering without JavaScript undetermined (excluded from the calculation) (weight 25) · machine-readable spec: none found (weight 25) · llms.txt: https://developer.paddle.com/llms.txt (weight 10) · 0 runnable example(s) (weight 10). Weighted average over 75 points of available sub-criteria.
Auth Frictionmeasured · weight 10 · Oct 5, 2026
95/100
Authorization: Bearer <key>, verified by a successful call. One header, no ceremony.
- https://sandbox-api.paddle.com/products
HTTP 403: {"error":{"type":"request_error","code":"forbidden","detail":"You aren't permitted to perform this request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/forbidden"},"meta":{"req
- https://sandbox-api.paddle.com/products/nonexistent_resource_xyz
HTTP 404: {"error":{"type":"request_error","code":"invalid_url","detail":"URL called is invalid.","documentation_url":"https://developer.paddle.com/v1/errors/shared/invalid_url"},"meta":{"request_id":"947b5a91-
- https://sandbox-api.paddle.com/products?per_page=not_a_number
HTTP 400: {"error":{"type":"request_error","code":"bad_request","detail":"Invalid request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/bad_request","errors":[{"field":"per_page","message
- https://sandbox-api.paddle.com/products?status=nonexistent_status
HTTP 400: {"error":{"type":"request_error","code":"bad_request","detail":"Invalid request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/bad_request","errors":[{"field":"status[0]","messag
Safety & Reversibilityprobed · weight 10 · Oct 5, 2026
42/100
Two identical POSTs with the same Idempotency-Key header created TWO distinct resources (pro_01m45zrckjdjs4w0c66n58x0j1 then pro_01m45zrdj9vf5s2wd83xkr89pj). Every network timeout becomes a duplicate. (weight 35) · Isolated test environment available. (weight 25). Weighted average over 60 points of measured sub-criteria.
- https://sandbox-api.paddle.com/products
HTTP 403: {"error":{"type":"request_error","code":"forbidden","detail":"You aren't permitted to perform this request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/forbidden"},"meta":{"req
- https://sandbox-api.paddle.com/products/nonexistent_resource_xyz
HTTP 404: {"error":{"type":"request_error","code":"invalid_url","detail":"URL called is invalid.","documentation_url":"https://developer.paddle.com/v1/errors/shared/invalid_url"},"meta":{"request_id":"947b5a91-
- https://sandbox-api.paddle.com/products?per_page=not_a_number
HTTP 400: {"error":{"type":"request_error","code":"bad_request","detail":"Invalid request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/bad_request","errors":[{"field":"per_page","message
- https://sandbox-api.paddle.com/products?status=nonexistent_status
HTTP 400: {"error":{"type":"request_error","code":"bad_request","detail":"Invalid request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/bad_request","errors":[{"field":"status[0]","messag
Payload Efficiencyprobed · weight 8 · Oct 5, 2026
53/100
No discoverable field selection (tested fields, select, _fields, expand, properties): the agent swallows the whole resource. (weight 35) · 284 bytes per returned object (2 object(s) in the control response). (weight 25) · Cursor pagination detected ("has_more"). (weight 20) · One list envelope, standard. (weight 10) · No ETag. (Compression is not measurable: the runtime decompresses it and strips the header.) (weight 10). Weighted average over 100 points of measured sub-criteria.
- https://sandbox-api.paddle.com/products
HTTP 403: {"error":{"type":"request_error","code":"forbidden","detail":"You aren't permitted to perform this request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/forbidden"},"meta":{"req
- https://sandbox-api.paddle.com/products/nonexistent_resource_xyz
HTTP 404: {"error":{"type":"request_error","code":"invalid_url","detail":"URL called is invalid.","documentation_url":"https://developer.paddle.com/v1/errors/shared/invalid_url"},"meta":{"request_id":"947b5a91-
- https://sandbox-api.paddle.com/products?per_page=not_a_number
HTTP 400: {"error":{"type":"request_error","code":"bad_request","detail":"Invalid request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/bad_request","errors":[{"field":"per_page","message
- https://sandbox-api.paddle.com/products?status=nonexistent_status
HTTP 400: {"error":{"type":"request_error","code":"bad_request","detail":"Invalid request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/bad_request","errors":[{"field":"status[0]","messag
Task Atomicitymeasured · weight 6
—/100
How many calls for a single business intent?
Prior Knowledge Coveragemeasured · weight 5 · Oct 5, 2026
0/100
No successful run (0/2): interaction cost not measurable. Cold, without documentation: 0/1 succeeded.
Async Compatibilityprobed · weight 2 · Oct 5, 2026
100/100
POST /products returns an identifier, and GET /products/{id} reads it back (HTTP 200): the result can be retrieved by polling, with no server to host. Long-polling / SSE not probed, excluded from the weighting.
- https://sandbox-api.paddle.com/products
HTTP 403: {"error":{"type":"request_error","code":"forbidden","detail":"You aren't permitted to perform this request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/forbidden"},"meta":{"req
- https://sandbox-api.paddle.com/products/nonexistent_resource_xyz
HTTP 404: {"error":{"type":"request_error","code":"invalid_url","detail":"URL called is invalid.","documentation_url":"https://developer.paddle.com/v1/errors/shared/invalid_url"},"meta":{"request_id":"947b5a91-
- https://sandbox-api.paddle.com/products?per_page=not_a_number
HTTP 400: {"error":{"type":"request_error","code":"bad_request","detail":"Invalid request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/bad_request","errors":[{"field":"per_page","message
- https://sandbox-api.paddle.com/products?status=nonexistent_status
HTTP 400: {"error":{"type":"request_error","code":"bad_request","detail":"Invalid request.","documentation_url":"https://developer.paddle.com/v1/errors/shared/bad_request","errors":[{"field":"status[0]","messag
Tool-Native (MCP)binary · weight 2
—/100
Does the vendor publish an official, maintained MCP server?
Runs, verified
never on the agent’s word.
Every row is a real attempt at the category’s canonical task. Success is verified by reading the created resource back.
| Task | Tokens | Calls | Errors | Docs | Result |
|---|---|---|---|---|---|
| charge-a-customer | 15,957 | 5 | 2 | without | failed |
| charge-a-customer | 21,611 | 4 | 1 | with | failed |
| charge-a-customer | 72,070 | 10 | 3 | with | failed |
The same entry,
without the markup.
You publish this API and dispute a score? The methodology is public and every score above points to the evidence that produced it.