Skip to content
Gauge

ax-check.com

Decisionly

docs.decisionly.com

ax-check.com

Checked 18 September 2026

A

100/100

Agents need your login

Docs are clean and quick, but pricing stays hidden

Quickstart, API reference and llms.txt are all solid, but no pricing page exists — agents are told to contact sales instead of getting a number.

1 fix to start with

Concrete changes, backed by what we found.

Onboarding

Give agents a clear login handoff and a way to resume setup.

Agents cannot progress through onboarding without human help. Provide an agent-accessible path through authentication and setup.

Recorded coding sessions

Same task, 3 models, no docs.decisionly.com account. Recorded 18 September 2026 on Pi.

3 recorded · 4m 7s

4m 7s · recorded

Session findings

Select a finding to see it in context.

piv0.84.2
modelQwen 3.8 Maxcwd/sandbox/repo
Help me build a simple example using Decisionly. Tell me how pricing works, and briefly tell me whether this product will be easy for you to manage. Let me know if you get blocked. If this product has no developer workflow you can act on, say so plainly and stop. Stay light: use the hosted product through its SDK or API. Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop.
Thinking…

I don't know "Decisionly". Let me check the repository, and possibly npm or the internet. I can't browse the web, but can I try the npm registry via bash? Maybe the sandbox has no network. Let me check.

$ ls -la /sandbox/repo && cat /sandbox/repo/README* 2>/dev/null | head -50{"content":[{"text":"total 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Sep 18 22:36 ..\ndrwxr-xr-x 8 root root 4096 Sep 18 08:00…ctrl+o
{"content":[{"text":"total 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Sep 18 22:36 ..\ndrwxr-xr-x 8 root root 4096 Sep 18 08:00 .git\n-rw-r--r-- 1 root root  408 Sep 18 08:00 .gitignore\n","type":"text"}]}
$ npm view decisionly 2>&1 | head -30; echo ---; pip index versions decisionly 2>&1 | head -5{"content":[{"text":"npm error code E404\nnpm error 404 Not Found - GET https://registry.npmjs.org/decisionly - Not found\nnpm error 404\nnpm error 404 'decisi…ctrl+o
{"content":[{"text":"npm error code E404\nnpm error 404 Not Found - GET https://registry.npmjs.org/decisionly - Not found\nnpm error 404\nnpm error 404  'decisionly@*' is not in this registry.\nnpm error 404\nnpm error 404 Note that you can also install from a\nnpm error 404 tarball, folder, http url, or git url.\nnpm error A complete log of this run can be found in: /sandbox/.npm/_logs/2026-09-18T22_36_46_256Z-debug-0.log\n---\nERROR: No matching distribution found for decisionly\n","type":"text"}]}
Thinking…

Decisionly doesn't seem to exist on npm or PyPI. Let me quickly check for name variations.

$ npm search decisionly --json 2>/dev/null | head -40; echo ---; curl -s "https://pypi.org/search/?q=decisionly" -o /dev/null -w "%{http_code}\n"; curl -s "https://pypi.org/pypi/decisionly/json" | head …{"content":[{"text":"\n[]\n\n---\n200\n{\"message\": \"Not Found\"}\n{\"objects\":[],\"total\":0,\"time\":\"2026-09-18T22:36:53.924Z\"}","type":"text"}]}ctrl+o
npm search decisionly --json 2>/dev/null | head -40; echo ---; curl -s "https://pypi.org/search/?q=decisionly" -o /dev/null -w "%{http_code}\n"; curl -s "https://pypi.org/pypi/decisionly/json" | head -5; echo; curl -s "https://registry.npmjs.org/-/v1/search?text=decisionly&size=5" | head -c 1000

Thinking…

Nothing on npm or PyPI. Maybe I can check general web search via curl? Search engines might be blocked, but let me try duckduckgo.

$ curl -s "https://duckduckgo.com/html/?q=Decisionly" | grep -oE 'result__a[^<]*<[^>]*>[^<]*' | head -10; echo ---; curl -s "https://api.github.com/search/repositories?q=decisionly" | head -c 600{"content":[{"text":"---\n{\n \"total_count\": 269050,\n \"incomplete_results\": false,\n \"items\": [\n {\n \"id\": 97574655,\n \"node_id\": \"…ctrl+o
{"content":[{"text":"---\n{\n  \"total_count\": 269050,\n  \"incomplete_results\": false,\n  \"items\": [\n    {\n      \"id\": 97574655,\n      \"node_id\": \"MDEwOlJlcG9zaXRvcnk5NzU3NDY1NQ==\",\n      \"name\": \"madr\",\n      \"full_name\": \"adr/madr\",\n      \"private\": false,\n      \"owner\": {\n        \"login\": \"adr\",\n        \"id\": 30127167,\n        \"node_id\": \"MDEyOk9yZ2FuaXphdGlvbjMwMTI3MTY3\",\n        \"avatar_url\": \"https://avatars.githubusercontent.com/u/30127167?v=4\",\n        \"gravatar_id\": \"\",\n        \"url\": \"https://api.github.com/users/adr\",\n        \"html_url\": \"https://github.com/adr\",\n        \"followers_url\": \"https://api.github.com/","type":"text"}]}
Thinking…

The GitHub search doesn't seem to be an exact match (it's returning unrelated results, probably fuzzy matching). The DDG HTML didn't return anything. I'll try checking decisionly.com, docs.decisionly.com, and www.decisionly.com.

$ for d in decisionly.com decisionly.io decisionly.ai decisionly.dev docs.decisionly.com app.decisionly.com; do echo "== $d"; curl -s -o /dev/null -m 8 -w "%{http_code} %{url_effective}\n" -L "https://$…{"content":[{"text":"== decisionly.com\n200 https://www.decisionly.com/\n== decisionly.io\n000 https://decisionly.io/\n== decisionly.ai\n502 https://decisionly.…ctrl+o
for d in decisionly.com decisionly.io decisionly.ai decisionly.dev docs.decisionly.com app.decisionly.com; do echo "== $d"; curl -s -o /dev/null -m 8 -w "%{http_code} %{url_effective}\n" -L "https://$d"; done

{"content":[{"text":"== decisionly.com\n200 https://www.decisionly.com/\n== decisionly.io\n000 https://decisionly.io/\n== decisionly.ai\n502 https://decisionly.ai/\n== decisionly.dev\n200 https://decisionly.dev/\n== docs.decisionly.com\n200 https://docs.decisionly.com/introduction\n== app.decisionly.com\n000 https://app.decisionly.com/\n\n\nCommand exited with code 6","type":"text"}],"details":{}}
Thinking…

decisionly.com and docs.decisionly.com exist. Let me fetch them to understand the product and check the SDK/API, pricing, and quickstart.

$ curl -s -L https://www.decisionly.com/ | python3 -c "import sys,html,re; t=sys.stdin.read(); t=re.sub(r'<script.*?</script>','',t,flags=re.S); t=re.sub(r'<style.*?</style>','',t,flags=re.S); t=re.sub(…{"content":[{"text":" Decisionly - AI-Powered Dispute Automation for Card Issuers Resources Jobs Docs Login Automate disputes. Scale effortlessly. Boost efficie…ctrl+o
curl -s -L https://www.decisionly.com/ | python3 -c "import sys,html,re; t=sys.stdin.read(); t=re.sub(r'<script.*?</script>','',t,flags=re.S); t=re.sub(r'<style.*?</style>','',t,flags=re.S); t=re.sub(r'<[^>]+>',' ',t); print(re.sub(r'\s+',' ',html.unescape(t))[:3000])"

{"content":[{"text":" Decisionly - AI-Powered Dispute Automation for Card Issuers Resources Jobs Docs Login Automate disputes. Scale effortlessly. Boost efficiency across the entire dispute lifecycle. Built for issuers. Get in touch → Trusted by leading issuers Unlock AI-powered dispute management Operate Efficiently Eliminate manual overhead, write-offs and fraud losses to grow without friction. Maximize Performance Customize workflows, leverage first-party fraud signals, and eliminate errors. Stay Compliant Built-in compliance with Reg E and Z, network rules and industry standards. Enterprise-grade security and compliance SOC II Type 2 Compliant PCI DSS Compliant SSO/SAML and RBAC End-to-end Encryption Our results End-to-end automation 80% manual workload eliminated Cost reduction 60% cost saving per dispute Improved experience 70% faster customer communication Ready to automate your disputes? Get in touch → ©2026 Decisionly. All rights reserved. Terms Privacy Policy \n","type":"text"}]}
$ curl -s -L https://docs.decisionly.com/introduction | python3 -c "import sys,html,re; t=sys.stdin.read(); t=re.sub(r'<script.*?</script>','',t,flags=re.S); t=re.sub(r'<style.*?</style>','',t,flags=re.…{"content":[{"text":" Introduction - Decisionly API Documentation Documentation Index Fetch the complete documentation index at: /llms.txt Use this file to disc…ctrl+o
curl -s -L https://docs.decisionly.com/introduction | python3 -c "import sys,html,re; t=sys.stdin.read(); t=re.sub(r'<script.*?</script>','',t,flags=re.S); t=re.sub(r'<style.*?</style>','',t,flags=re.S); t=re.sub(r'<[^>]+>',' ',t); print(re.sub(r'\s+',' ',html.unescape(t))[:4000])"

{"content":[{"text":" Introduction - Decisionly API Documentation Documentation Index Fetch the complete documentation index at: /llms.txt Use this file to discover all available pages before exploring further. Skip to main content Decisionly API Documentation home page Search... ⌘ K Dashboard Dashboard Search... Navigation Getting Started Introduction Documentation API v2 (Current) Dashboard Getting Started Introduction Quickstart What Are Disputes? Dispute Types Core Concepts Authentication API Versioning Pagination Errors Case Lifecycle Webhooks Custom Fields Reference IDs Categorization Testing Filing Filing a Dispute Filing Timelines Filing Requirements Workflow and Validations Workflow Rules Fraud Liability Evidence Review On this page Test Mode Getting Started Base URL Need Help? Getting Started Introduction Copy page Copy page Get started with the Decisionly API to automate dispute filing Copy page Copy page The Decisionly API is organized around REST . The API has resource-oriented URLs, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs. ​ Test Mode You can use the Decisionly API in test mode, which doesn’t affect your live data or interact with the card networks. The API key you use to authenticate the request determines whether the request is live mode or test mode. ​ Getting Started To get started: Create a new API key from your settings page Read the Quickstart guide to learn how to make your first request Explore the API reference to learn about available resources and endpoints ​ Base URL All API requests should be made to: https://api.decisionly.com/v2/issuer ​ Need Help? Contact us at support@decisionly.com Quickstart Powered by This documentation is built and hosted on Mintlify, a developer documentation platform \n","type":"text"}]}
Thinking…

The actual product has documentation. Fetch /llms.txt to check the index, and verify the quickstart and pricing pages.

$ curl -s https://docs.decisionly.com/llms.txt{"content":[{"text":"# Decisionly API Documentation\n\n- [Introduction](https://docs.decisionly.com/introduction.md): Get started with the Decisionly API to aut…ctrl+o
{"content":[{"text":"# Decisionly API Documentation\n\n- [Introduction](https://docs.decisionly.com/introduction.md): Get started with the Decisionly API to automate dispute filing\n- [Quickstart](https://docs.decisionly.com/quickstart.md): Learn how to file your first dispute with the Decisionly API\n- [What Are Disputes?](https://docs.decisionly.com/guide.md): What disputes are, how they work, and what you need to know as an issuer\n- [Dispute Types](https://docs.decisionly.com/dispute-types.md): Understanding dispute categories and required evidence\n- [Authentication](https://docs.decisionly.com/authentication.md): Learn how to authenticate with the Decisionly API\n- [API Versioning](https://docs.decisionly.com/versioning.md): Understanding Decisionly API versions and changes\n- [Pagination](https://docs.decisionly.com/pagination.md): Learn how to paginate through list responses\n- [Errors](https://docs.decisionly.com/errors.md): Understanding Decisionly API error responses\n- [Case Lifecycle](https://docs.decisionly.com/case-lifecycle.md): Understanding case statuses and terminal states\n- [Webhooks](https://docs.decisionly.com/webhooks.md): Receive real-time updates about your cases\n- [Custom Fields](https://docs.decisionly.com/custom-fields.md): Associate additional metadata with your cases\n- [Reference IDs](https://docs.decisionly.com/reference-ids.md): Link cases to your internal systems with reference IDs\n- [Categorization](https://docs.decisionly.com/categorization.md): How Decisionly categorizes disputes with reason 'other'\n- [Testing](https://docs.decisionly.com/testing.md): Use test mode overrides to pass or fail evidence review\n- [Filing a Dispute](https://docs.decisionly.com/filing.md): Learn how to file disputes with the card network\n- [Filing Timelines](https://docs.decisionly.com/filing-timelines.md): Filing windows for each dispute type and card network\n- [Filing Requirements](https://docs.decisionly.com/filing-requirements.md): Required fields and documentation for each dispute type and card network\n- [Workflow Rules](https://docs.decisionly.com/workflow-rules.md): Customize filing decisions with workflow rules\n- [Fraud Liability](https://docs.decisionly.com/fraud-liability.md): Network data checks for fraud disputes\n- [Evidence Review](https://docs.decisionly.com/evidence-review.md)\n- [Create a case](https://docs.decisionly.com/api-reference/v2-cases/create-a-case.md): Creates a new case.\n- [List all cases](https://docs.decisionly.com/api-reference/v2-cases/list-all-cases.md): Returns a list of all cases.\n- [Retrieve a case](https://docs.decisionly.com/api-reference/v2-cases/retrieve-a-case.md): Returns a case by ID.\n- [Update a case](https://docs.decisionly.com/api-reference/v2-cases/update-a-case.md): Updates a case. Filed cases cannot be updated. Partial updates are supported - you only need to include the fields you want to update in the request body.\n- [Delete a case](https://docs.decisionly.com/api-reference/v2-cases/delete-a-case.md): Deletes a case by ID. Filed cases cannot be deleted.\n- [File a case](https://docs.decisionly.com/api-reference/v2-cases/file-a-case.md): Files a case with the card network. The case must be in 'created' status to be filed.\n- [Withdraw a case](https://docs.decisionly.com/api-reference/v2-cases/withdraw-a-case.md): Withdraws a case. The case must be in 'created' or 'chargeback_filed' status to be withdrawn.\n- [List all events](https://docs.decisionly.com/api-reference/v2-events/list-all-events.md): Returns a list of all events for an account. Events are also delivered via webhooks - see the [Webhooks documentation](/webhooks) for more details.\n- [Upload a file](https://docs.decisionly.com/api-reference/v2-files/upload-a-file.md): Upload a file that can be attached as documentation to cases.\n- [Create a claim](https://docs.decisionly.com/api-reference/v2-claims/create-a-claim.md): Creates a new claim by grouping existing cases together.\n- [List all claims](https://docs.decisionly.com/api-reference/v2-claims/list-all-claims.md): Returns a simplified list of all claims. Use the retrieve endpoint to get full claim details with cases.\n- [Retrieve a claim](https://docs.decisionly.com/api-reference/v2-claims/retrieve-a-claim.md): Returns a claim by ID with all associated cases and their full details.\n- [Set claim cases](https://docs.decisionly.com/api-reference/v2-claims/set-claim-cases.md): Replaces all cases in a claim with the supplied list.\n- [Create a claim with cases](https://docs.decisionly.com/api-reference/v2-claims/create-a-claim-with-cases.md): Creates a new claim and all its cases in a single request.\n- [File a claim](https://docs.decisionly.com/api-reference/v2-claims/file-a-claim.md): Files each case in the claim to the card network.\n- [Withdraw a claim](https://docs.decisionly.com/api-reference/v2-claims/withdraw-a-claim.md): Withdraws all cases in a claim.\n\n## OpenAPI Specs\n\n- [openapi](/api-reference/v2/openapi.yaml)\n\n## Optional\n\n- [Dashboard](https://decisionly.com)\n","type":"text"}]}
Thinking…

There's a quickstart. Grab quickstart.md, authentication.md, and possibly testing.md. Also, need to check whether the docs mention pricing — probably not, since it's an enterprise "contact us" type product. Also check whether an SDK exists (npm package? @decisionly/sdk?). Let me grab the quickstart and check npm.

$ curl -s https://docs.decisionly.com/quickstart.md; echo "=====AUTH"; curl -s https://docs.decisionly.com/authentication.md{"content":[{"text":"> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.decisionly.com/llms.txt\n> Use this file to discover al…ctrl+o
{"content":[{"text":"> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.decisionly.com/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Quickstart\n\n> Learn how to file your first dispute with the Decisionly API\n\nFiling disputes is a time consuming and often confusing process. Use the Decisionly API to quickly and confidently file your disputes. Our API ensures that you will meet all the requirements and timelines for the type of dispute you wish to file.\n\n<Info>\n  New to disputes? Read [What Are Disputes?](/guide) first to understand the dispute lifecycle, card network rules, and key terminology.\n</Info>\n\n<Info>\n  Before you can make requests to the Decisionly API, you will need to grab your API key from your dashboard [settings](https://decisionly.com/settings).\n</Info>\n\n<Note>\n  **Replace the sample API key.** The key `test_d0019b48d05849a6` used in these examples is for illustration only and will return an `Invalid API key` error. Substitute your real API key from the dashboard [settings](https://decisionly.com/settings).\n</Note>\n\n## Step 1: Create a case\n\nCreate a case with cardholder information, card details, transaction information, and dispute details:\n\n<CodeGroup>\n  ```bash Create a case theme={null}\n  curl https://api.decisionly.com/v2/issuer/cases \\\n    -u test_d0019b48d05849a6: \\\n    -H \"Content-Type: application/json\" \\\n    -d '{\n      \"cardholder\": {\n        \"billing_address\": {\n          \"city\": \"San Francisco\",\n          \"country\": \"US\",\n          \"line1\": \"742 Evergreen Terrace\",\n          \"line2\": \"Unit 5B\",\n          \"postal_code\": \"94102\",\n          \"state\": \"CA\"\n        },\n        \"email\": \"jane@example.com\",\n        \"issuer_id\": \"9529456289\",\n        \"name\": \"Jane Smith\",\n        \"type\": \"individual\"\n      },\n      \"dispute\": {\n        \"amount\": 2990,\n        \"currency\": \"USD\",\n        \"date\": \"2026-04-20T00:00:00.000Z\",\n        \"raised_by\": \"cardholder\",\n        \"reason\": \"product_not_received\"\n      },\n      \"issuer_evidence\": {\n        \"cardholder_explanation\": \"I never received this order\",\n        \"product\": {\n          \"type\": \"merchandise\"\n        },\n        \"delivery\": {\n          \"expected_date\": \"2026-04-05T00:00:00.000Z\"\n        },\n        \"merchant_contact\": {\n          \"was_attempted\": true,\n          \"date\": \"2026-04-08T00:00:00.000Z\",\n          \"was_successful\": false,\n          \"description\": \"Contacted merchant via email but received no response\"\n        }\n      },\n      \"merchant\": {\n        \"category_code\": \"5812\",\n        \"name\": \"FoodHub\"\n      },\n      \"transaction\": {\n        \"amount\": 2990,\n        \"arn\": \"48162855246353338636162\",\n        \"card\": {\n          \"expiry_month\": 12,\n          \"expiry_year\": 2028,\n          \"last4\": \"4242\",  \n          \"network\": \"mastercard\",\n          \"type\": \"credit\"\n        },\n        \"currency\": \"USD\",\n        \"date\": \"2026-03-28T00:00:00.000Z\"\n      }\n    }'\n  ```\n</CodeGroup>\n\n<Note>\n  **Keep dates within the filing window.** The `product_not_received` reason requires filing within 120 days of the transaction date. If `delivery.expected_date` is provided, filing must also be after that date. Replace the dates in this example with current transaction and delivery dates.\n</Note>\n\n## Step 2: File the case\n\nFile the case with the card network:\n\n<CodeGroup>\n  ```bash File a case theme={null}\n  curl https://api.decisionly.com/v2/issuer/cases/case_abc123/file \\\n    -u test_d0019b48d05849a6: \\\n    -X POST \\\n    -H \"Content-Type: application/json\" \\\n    -d '{\n      \"file_mode\": \"auto\"\n    }'\n  ```\n</CodeGroup>\n\nSet `file_mode` to `auto` to let your workflow rules determine how the case should be filed, or `chargeback` to file the case as a chargeback.\n\n## Next Steps\n\n<CardGroup cols={2}>\n  <Card title=\"Dispute Types\" icon=\"list\" href=\"/dispute-types\">\n    Learn about the different dispute reasons and requirements\n  </Card>\n\n  <Card title=\"Workflow Rules\" icon=\"diagram-project\" href=\"/workflow-rules\">\n    Set up rules to automate your filing decisions\n  </Card>\n</CardGroup>\n=====AUTH\n> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.decisionly.com/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Authentication\n\n> Learn how to authenticate with the Decisionly API\n\nThe Decisionly API uses API keys to authenticate requests. You can view and manage your API keys from your dashboard [settings](https://decisionly.com/settings).\n\n## API Key Prefixes\n\n* Test mode secret keys have the prefix `test_`\n* Live mode secret keys have the prefix `live_`\n\n## HTTP Basic Auth\n\nAuthentication to the API is performed via HTTP Basic Auth. Provide your API key as the basic auth username value. You do not need to provide a password.\n\n<CodeGroup>\n  ```bash cURL theme={null}\n  curl https://api.decisionly.com/v2/issuer/cases \\\n    -u test_d0019b48d05849a6:\n  ```\n\n  ```javascript Node.js theme={null}\n  const apiKey = 'test_d0019b48d05849a6';\n  const auth = Buffer.from(`${apiKey}:`).toString('base64');\n\n  fetch('https://api.decisionly.com/v2/issuer/cases', {\n    headers: {\n      'Authorization': `Basic ${auth}`\n    }\n  });\n  ```\n\n  ```python Python theme={null}\n  import requests\n\n  api_key = 'test_d0019b48d05849a6'\n  response = requests.get(\n      'https://api.decisionly.com/v2/issuer/cases',\n      auth=(api_key, '')\n  )\n  ```\n</CodeGroup>\n","type":"text"}]}
$ curl -s "https://registry.npmjs.org/-/v1/search?text=decisionly&size=10" | python3 -m json.tool | grep -E '"name"|"description"' ; echo ---; curl -s "https://pypi.org/simple/" -m 20 | grep -i decision…{"content":[{"text":"---\n<a href=\"/simple/acquisition-decisions-legacy/\">acquisition-decisions-legacy</a>\n<a href=\"/simple/acquisition-decisions-sc/\">acqu…ctrl+o
curl -s "https://registry.npmjs.org/-/v1/search?text=decisionly&size=10" | python3 -m json.tool | grep -E '"name"|"description"' ; echo ---; curl -s "https://pypi.org/simple/" -m 20 | grep -i decision | head

{"content":[{"text":"---\n<a href=\"/simple/acquisition-decisions-legacy/\">acquisition-decisions-legacy</a>\n<a href=\"/simple/acquisition-decisions-sc/\">acquisition-decisions-sc</a>\n<a href=\"/simple/adaptivedecisionmaking-2018/\">AdaptiveDecisionMaking-2018</a>\n<a href=\"/simple/adi-decision/\">adi-decision</a>\n<a href=\"/simple/adzerk-decision-sdk/\">adzerk-decision-sdk</a>\n<a href=\"/simple/agent-decision-log/\">agent-decision-log</a>\n<a href=\"/simple/agi-app-mission-decision/\">agi-app-mission-decision</a>\n<a href=\"/simple/agi-page-decision-evidence/\">agi-page-decision-evidence</a>\n<a href=\"/simple/ai-decision-council/\">ai-decision-council</a>\n<a href=\"/simple/ai-decisions/\">ai-decisions</a>\n","type":"text"}]}
Thinking…

In other words: no official SDK (nothing on npm/PyPI), but a REST API exists, with documentation, test mode, HTTP Basic auth. API key requires a dashboard account ("Get in touch" enterprise sales). I don't have an API key, and creating one requires signing up through sales/login — probably blocked. Still, I can build a simple sample script (Python or Node) that wraps the REST API. Use environment variable keys, run it against the sandbox key to demonstrate the auth error and confirm connectivity. Pricing: the docs don't mention pricing. The site is enterprise-oriented "Get in touch." Should I quickly check the pricing page? Probably doesn't exist. Let me check decisionly.com/pricing and the docs. Quick check.

After that, build the sample: a small Python script decisionly_example.py in /sandbox/repo that uses requests to create a case in test mode. Run it with a fake key and verify we get an "Invalid API key" response (proving connectivity). This is lightweight and no local stack is required.

First, let me quickly check the pricing page.

$ for u in https://www.decisionly.com/pricing https://docs.decisionly.com/pricing.md https://www.decisionly.com/terms; do echo "== $u"; curl -s -o /tmp/p -m 10 -w "%{http_code}\n" -L "$u"; grep -io -m5 …{"content":[{"text":"== https://www.decisionly.com/pricing\n200\n== https://docs.decisionly.com/pricing.md\n404\n== https://www.decisionly.com/terms\n200\nplans…ctrl+o
for u in https://www.decisionly.com/pricing https://docs.decisionly.com/pricing.md https://www.decisionly.com/terms; do echo "== $u"; curl -s -o /tmp/p -m 10 -w "%{http_code}\n" -L "$u"; grep -io -m5 'pricing\|per dispute\|/month\|plans' /tmp/p | sort -u | head; done; echo; curl -s https://docs.decisionly.com/llms.txt | grep -i pric

{"content":[{"text":"== https://www.decisionly.com/pricing\n200\n== https://docs.decisionly.com/pricing.md\n404\n== https://www.decisionly.com/terms\n200\nplans\npricing\n\n\n\nCommand exited with code 1","type":"text"}],"details":{}}
Thinking…

/pricing returned 200 — but the "pricing" grep didn't match anything in the body? Actually, the grep output after "200" was empty. Probably an SPA that redirects to home. Let me fetch the content of the pricing page and check.

$ curl -s -L https://www.decisionly.com/pricing | python3 -c "import sys,html,re; t=sys.stdin.read(); t=re.sub(r'<script.*?</script>','',t,flags=re.S); t=re.sub(r'<style.*?</style>','',t,flags=re.S); t=…{"content":[{"text":" Log in Log in to your account Tell us what your email address is and we will route you to your identity provider. Email address Log in Try…ctrl+o
curl -s -L https://www.decisionly.com/pricing | python3 -c "import sys,html,re; t=sys.stdin.read(); t=re.sub(r'<script.*?</script>','',t,flags=re.S); t=re.sub(r'<style.*?</style>','',t,flags=re.S); t=re.sub(r'<[^>]+>',' ',t); print(re.sub(r'\s+',' ',html.unescape(t))[:1500])"

{"content":[{"text":" Log in Log in to your account Tell us what your email address is and we will route you to your identity provider. Email address Log in Trying to set up account? Sign up \n","type":"text"}]}
Thinking…

thin/pricing redirects to login. In other words, pricing is not public — enterprise-oriented, sales-led ("Get in touch"). This can be stated candidly.

Next, build a sample. There's a REST API with a test mode, no official SDK. Write a small self-contained sample (Python using only stdlib's urllib, or requests — check if requests is available; to avoid dependencies, using stdlib is better). Create a sample that does the following:

  1. Read the DECISIONLY_API_KEY environment variable
  2. Create a case (test mode)
  3. Fetch the case / file it

Run with a dummy key to verify connectivity → expect "Invalid API key". This will show that we're blocked on real credentials, but the workflow is executable.

Decisionly is a real product, and it has a developer workflow that I can operate: it's an AI-powered dispute automation platform for card issuers, and it has a hosted REST API (v2), a test mode, and complete documentation (docs.decisionly.com). Since there's no official SDK on npm/PyPI, I'll build a lightweight example with plain HTTP. Let me write that up and verify the connectivity.

$ curl -s https://docs.decisionly.com/testing.md | head -80{"content":[{"text":"> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.decisionly.com/llms.txt\n> Use this file to discover al…ctrl+o
{"content":[{"text":"> ## Documentation Index\n> Fetch the complete documentation index at: https://docs.decisionly.com/llms.txt\n> Use this file to discover all available pages before exploring further.\n\n# Testing\n\n> Use test mode overrides to pass or fail evidence review\n\nWhen you create a case with a [test mode API key](/authentication#api-key-prefixes) (prefix `test_`), Decisionly recognizes special values for the issuer explanation and file category that bypass AI analysis and return mock [Evidence Review](/evidence-review) results. Use these to exercise both the pass and fail branches of your [workflow rules](/workflow-rules) without crafting realistic evidence and documents.\n\n<Info>\n  These overrides only take effect on accounts using a `test_` API key. In live mode they're treated as regular values.\n</Info>\n\n## Evidence Review and Fraud Liability overrides\n\nInclude one of the values below anywhere in [`issuer_explanation`](/api-reference/v2-cases/create-a-case#body-issuer-evidence-issuer-explanation-one-of-0) on the case's [`issuer_evidence`](/api-reference/v2-cases/create-a-case#body-issuer-evidence) to replace the AI [Evidence Review](/evidence-review) result and/or [Fraud Liability](/fraud-liability) result for the case.\n\nFor all dispute reasons:\n\n| `issuer_explanation` contains | Evidence Review result                                   |\n| ----------------------------- | -------------------------------------------------------- |\n| `valid_evidence`              | All conditions for the dispute reason marked **met**     |\n| `invalid_evidence`            | All conditions for the dispute reason marked **not met** |\n\nFor fraud disputes, you can additionally control [Fraud Liability](/fraud-liability):\n\n| `issuer_explanation` contains | Fraud Liability result                                       |\n| ----------------------------- | ------------------------------------------------------------ |\n| `merchant_liable`             | Liability assigned to the merchant (chargeback rights exist) |\n| `issuer_liable`               | Liability assigned to the issuer (no chargeback rights)      |\n\n## Documentation Review overrides\n\nSet a file's `category` to one of the values below when [uploading the file](/api-reference/v2-files/upload-a-file) to replace the AI [Documentation Review](/evidence-review) result for that file. The relevance check is skipped entirely.\n\n| File `category` value | Documentation Review result       |\n| --------------------- | --------------------------------- |\n| `valid_document`      | File marked as valid and relevant |\n| `invalid_document`    | File marked as invalid            |\n\nThis is a per-file override — you can mix `valid_document` and `invalid_document` files in the same case.\n\n## Example\n\nUpload a file with the `valid_document` category, then create a case that references it and uses `invalid_evidence` to force conditions review to fail:\n\n<CodeGroup>\n  ```bash cURL theme={null}\n  # 1. Upload a file with the valid_document test category\n  curl https://api.decisionly.com/v2/issuer/files \\\n    -u test_d0019b48d05849a6: \\\n    -F \"category=valid_document\" \\\n    -F \"file=@receipt.pdf\"\n\n  # Response: { \"id\": \"file_abc123\", \"category\": \"valid_document\", ... }\n\n  # 2. Create a case that forces the conditions check to fail\n  curl https://api.decisionly.com/v2/issuer/cases \\\n    -u test_d0019b48d05849a6: \\\n    -H \"Content-Type: application/json\" \\\n    -d '{\n      \"dispute\": { \"reason\": \"product_not_received\" },\n      \"issuer_evidence\": {\n        \"issuer_explanation\": \"invalid_evidence\",\n        \"documentation\": [\"file_abc123\"]\n      }\n    }'\n  ```\n</CodeGroup>\n\n<CardGroup cols={2}>\n  <Card title=\"Evidence Review\" icon=\"magnifying-glass\" href=\"/evidence-review\">\n    How Documentation Review and Conditions Review work in production\n  </Card>\n\n  <Card title=\"Workflow Rules\" icon=\"diagram-project\" href=\"/workflow-rules\">\n    Configure how cases are handled based on evidence review results\n  </Card>\n</CardGroup>\n","type":"text"}]}
Thinking…

Next, I'll write a sample script. Purely standard library only (urllib), no dependencies. Example: create a case → retrieve → submit. Key via environment variable. Dates must be within 120 days from now (calculate dynamically). After that, run with a dummy key and confirm that a proper "Invalid API key" error is returned.

write /sandbox/repo/decisionly_example.py{"content":[{"text":"Successfully wrote 4389 bytes to /sandbox/repo/decisionly_example.py","type":"text"}]}
Thinking…

Next, we'll verify connectivity using a dummy key. We expect "Invalid API key" to be returned from the actual API — this proves that the endpoint is reachable and that the error handling is working.

$ cd /sandbox/repo && DECISIONLY_API_KEY=test_d0019b48d05849a6 python3 decisionly_example.py{"content":[{"text":"1. Creating case...\nHTTP 403 on POST /cases: {\n \"message\": \"This is the sample API key from the Decisionly quickstart guide. Replace …ctrl+o
{"content":[{"text":"1. Creating case...\nHTTP 403 on POST /cases: {\n  \"message\": \"This is the sample API key from the Decisionly quickstart guide. Replace it with your real API key from your dashboard settings.\"\n}\n\n\nCommand exited with code 1","type":"text"}],"details":{}}
Thinking…

The API is reachable and responds clearly. Without a real account (sales-led sign-up — "Get in touch" / login via identity provider), it's blocked. This is the expected blocker, so report it.

Pricing: not disclosed. The site is sales-led ("Get in touch"), and /pricing redirects to login. Their marketing does touts a "60% reduction in cost per dispute," but there's no price list.

Ease of operation: yes — clean REST API, test mode, llms.txt, OpenAPI spec, no local stack required. Blocker: obtaining an API key requires an account via sales/login.

Done. Here's the summary:

What I built

/sandbox/repo/decisionly_example.py — a dependency-free Python example against Decisionly's hosted REST API (https://api.decisionly.com/v2/issuer). It:

  1. Creates a dispute case (product_not_received, with dates computed dynamically to stay inside the 120-day filing window)
  2. Retrieves the case and prints its status
  3. Files it with the card network (file_mode: "auto")

It also uses Decisionly's test-mode override (valid_evidence in issuer_explanation) so the AI evidence review passes without crafting realistic evidence.

I verified it end-to-end as far as possible without credentials — the API responded cleanly to the docs' sample key:

HTTP 403: "This is the sample API key from the Decisionly quickstart guide.
Replace it with your real API key from your dashboard settings."

Blocked on one thing: a real API key. Keys come from the dashboard settings, and account creation is gated behind login/SSO ("Sign up" / "Get in touch" sales flow), which I can't complete. Drop export DECISIONLY_API_KEY=test_... in and the script should run.

How pricing works

Pricing is not public. Decisionly is an enterprise, sales-led product (SOC II / PCI DSS, SSO/SAML, "Get in touch" for signup); /pricing just redirects to login. Their marketing claims ~60% cost savings per dispute, but there's no published rate card, tiers, or per-case pricing anywhere in the docs or site. You'd need to talk to their sales team.

Will this be easy for me to manage?

Yes, the developer surface is good (once you have a key):

  • Plain REST + HTTP Basic Auth — no SDK needed (none exists on npm/PyPI), no local services, no long-running processes
  • Proper test mode (test_ keys) that never touches card networks, plus deterministic test overrides (valid_evidence, invalid_evidence, merchant_liable, valid_document) that make automated testing easy
  • Machine-friendly docs (/llms.txt, Markdown pages, OpenAPI spec), clear errors, webhooks, pagination

The only friction is the account/key acquisition being sales-gated.

AX Fundamentals

23 checks. Open an area for details.

This check is a quick preview. Test more tasks and models with Gauge Agents.

Test your product with Gauge Agents

AX Check by Gauge