Overview
Arettic gives an agent one key and one balance for its data jobs. For verified jobs it recommends the tool that works, runs it, checks the result against a published rule and charges only if it passes. For everything else there are hundreds of provider endpoints, paid per call and free when the provider fails.
Task types
Every request names one of the task types. The list is public: GET /v1/task-types.
| Task type | Used for | Example input |
|---|---|---|
| find_verified_email | Outbound prospecting, recruiting outreach, partner sourcing | {"first_name":"Emily","last_name":"Carter","domain":"acme.com"} |
| verify_email | Cleaning a list before a campaign, sign-up and CRM hygiene | {"email":"[email protected]"} |
| enrich_company | Account research, lead scoring and routing, CRM enrichment | {"domain":"acme.com"} |
| enrich_person | Lead qualification, contact research, candidate and investor research | {"first_name":"Jason","last_name":"Miller","company_domain":"acme.com"} |
| web_search | Market and competitor research, news monitoring, building target lists | {"query":"Series A fintech startups in New York","n":5} |
| extract_url | Reading pricing pages, docs, job posts and filings into an agent | {"url":"https://acme.com/pricing"} |
Test mode
Test keys start with sk_test_. They call mock providers that give the same answer every time and never spend credits, so you can build both the pass and the fail path.
curl https://api.arettic.com/v1/execute \ -H "Authorization: Bearer $ARETTIC_TEST_KEY" \ -H "Content-Type: application/json" \ -d '{ "tool_id": "mock-find-verified-email", "input": { "first_name": "Emily", "last_name": "Carter", "domain": "example.com" } }'
These inputs make the mock providers fail on purpose:
| Task | Input | Result |
|---|---|---|
| any | contains "provider-error" | failed · provider_error, nothing charged |
| any | contains "nomatch" | failed · no_result |
| find_verified_email | domain ends in ".catchall.test" | failed · catch_all |
| verify_email | email starts with "unknown" | failed · status:unknown |
| enrich_company | domain "missing-fields.test" | failed · field_missing:industry |
| enrich_person | company_domain contains "nocontact" | failed · field_missing:contact |
| web_search | query contains "few results" | partial · 2 of 5, charged pro rata |
| extract_url | url contains "blocked" | failed · blocked_page |
Responses
A pass returns the result. A fail returns only the reason: the data is withheld, because you didn't pay for it. Test mode also tells you what a live call would have cost, in credits and USD (1 credit = $0.001).
{ "test_mode": true, "status": "passed", "tool_id": "mock-find-verified-email", "check_version": "v1", "result": { "email": "[email protected]", "verification_status": "valid" }, "charged": { "credits": "0", "usd": "0.000" }, "would_have_charged": { "credits": "38", "usd": "0.038" } }
Data handling
Each purchase's input and result are stored encrypted with your org's own key for 7 days, so scores stay current and disputes can be checked, then deleted. An item under dispute is kept until it's decided (at most 48 hours more). Ask us to delete your data and it goes at once. After that we keep only hashes and non-personal signals (outcome, timing, coarse segment). Nothing is shared between customers, cached for others or used to train models.
Disputes
Think a charged result is wrong? Send POST /v1/disputes with the receipt_id and item_index, a reason (wrong_result, invalid_result, stale_result, duplicate_charge or other) and any evidence, within 7 days. We decide within 48 hours against the stored result; if we don't, it's upheld. Upheld disputes are refunded to your balance and count against the tool's score.
Webhooks
Owners add endpoints with POST /v1/orgs/{orgId}/webhooks; the signing secret is shown once. Events: balance.low, budget.80pct, approval.requested, approval.decided, job.completed, tool.paused, dispute.decided, price.changed and trial.expiring. Any 2xx counts as delivered; failures retry with backoff for 24 hours. Owners also get email for balance, budget, pauses, price changes, trial expiry and dispute decisions.
Verify each request: Arettic-Signature is t=<unix seconds>,v1=<hex>, where the hex is HMAC-SHA256 of <t>.<raw body> with your secret. Reject timestamps more than 5 minutes old.
Recommend
Ask which tool works for a task. Send a task_type or a plain-language task; the response says which type it chose. Tools are ranked by score, then price when scores are within 2 points. Whether a tool is sold through Arettic never changes its rank.
curl https://api.arettic.com/v1/recommend \ -H "Authorization: Bearer $ARETTIC_TEST_KEY" \ -H "Content-Type: application/json" \ -d '{ "task_type": "find_verified_email", "region": "US", "constraints": { "max_price": 50 }, "sort": "score" }'
Each option has its score, every score input (A, S, P, R, L, D), price_per_success, pass_rule and purchasable. Sort by score, price, value or latency.
Public data (no key)
Open under CC BY 4.0: GET /v1/task-types, /v1/tools, /v1/tools/{id}, /v1/scores, /v1/pricing, /v1/formula. Add ?mode=test to see the mock tools. Every page on this site is also available as Markdown or JSON: add .md or .json to the URL, or send an Accept header. See /llms.txt and /openapi.json.
MCP
The MCP server speaks Streamable HTTP at https://api.arettic.com/mcp. Authenticate with your agent key. Tools: list_task_types, recommend, get_tool, execute, get_job, get_receipt, open_dispute, get_approval, get_balance, search_endpoints and call_endpoint. Server card: /.well-known/mcp.json. Setup for each client: MCP server.
Org API: everything the dashboard does
Anything a person can do in the dashboard, an agent can do through the API. An org owner makes an org key on the Team page (ok_…, shown once) and the agent sends it as Authorization: Bearer ok_…. The key acts as the owner who made it, only on /v1/orgs/{orgId}/…, and a read key can only read. Keys can't make or revoke keys, and a key stops working when its maker leaves the org.
| Dashboard | Endpoint | Org key |
|---|---|---|
| Email me a sign-in link | POST /auth/email/start | Sign in |
| Sign out | POST /auth/logout | Sign in |
| Create an org | POST /v1/orgs | Sign in |
| Accept an invite | POST /v1/invites/accept | Sign in |
| Balance, spend and refund rate | GET /v1/orgs/{orgId}/dashboard | Yes |
| Your keys and how to connect | GET /v1/orgs/{orgId}/agents | Yes |
| Get a key (shown once) | POST /v1/orgs/{orgId}/agents | Yes |
| Change name, budget, approval threshold, IP allowlist or status | PATCH /v1/orgs/{orgId}/agents/{agentId} | Yes |
| Rotate an agent key | POST /v1/orgs/{orgId}/agents/{agentId}/rotate-key | Yes |
| Revoke an agent key | POST /v1/orgs/{orgId}/agents/{agentId}/revoke-key | Yes |
| Approval requests | GET /v1/orgs/{orgId}/approvals | Yes |
| Approve or reject a purchase | POST /v1/orgs/{orgId}/approvals/{id}/decision | Yes |
| Receipt explorer | GET /v1/orgs/{orgId}/receipts | Yes |
| One receipt | GET /v1/orgs/{orgId}/receipts/{id} | Yes |
| Export receipts as CSV | GET /v1/orgs/{orgId}/exports/receipts.csv | Yes |
| Dispute a charged item | POST /v1/orgs/{orgId}/disputes | Yes |
| Disputes and their decisions | GET /v1/orgs/{orgId}/disputes | Yes |
| Invoices | GET /v1/orgs/{orgId}/invoices | Yes |
| One invoice (JSON or printable HTML) | GET /v1/orgs/{orgId}/invoices/{id} | Yes |
| Balance and credit lots | GET /v1/orgs/{orgId}/balance | Yes |
| Top-up history | GET /v1/orgs/{orgId}/topups | Yes |
| Buy a credit pack (a checkout link, or the saved card at once) | POST /v1/orgs/{orgId}/topups | Yes |
| Auto-reload settings | GET /v1/orgs/{orgId}/auto-reload | Yes |
| Turn auto-reload on or off | PUT /v1/orgs/{orgId}/auto-reload | Yes |
| Low-balance alert level | PUT /v1/orgs/{orgId}/notifications | Yes |
| Plan, limits and subscriptions | GET /v1/orgs/{orgId}/plan | Yes |
| Start Pro or Scale (returns a checkout link) | POST /v1/orgs/{orgId}/subscriptions | Yes |
| Move between Pro and Scale, or change the interval (prorated) | POST /v1/orgs/{orgId}/subscriptions/change | Yes |
| Cancel a plan at period end | DELETE /v1/orgs/{orgId}/subscriptions/{plan} | Yes |
| Billing name, address, country and tax ID | PATCH /v1/orgs/{orgId}/billing | Yes |
| Webhook endpoints and event types | GET /v1/orgs/{orgId}/webhooks | Yes |
| Recent deliveries | GET /v1/orgs/{orgId}/webhook-deliveries | Yes |
| Recent events | GET /v1/orgs/{orgId}/events | Yes |
| Add an endpoint (secret shown once) | POST /v1/orgs/{orgId}/webhooks | Yes |
| Send a test event | POST /v1/orgs/{orgId}/webhooks/{id}/test | Yes |
| Delete an endpoint | DELETE /v1/orgs/{orgId}/webhooks/{id} | Yes |
| Members and pending invites | GET /v1/orgs/{orgId}/members | Yes |
| Rename the workspace | PATCH /v1/orgs/{orgId} | Yes |
| Invite by email | POST /v1/orgs/{orgId}/invites | Yes |
| Withdraw an invite | DELETE /v1/orgs/{orgId}/invites/{inviteId} | Yes |
| Make a member an owner, or back | PATCH /v1/orgs/{orgId}/members/{userId} | Yes |
| Remove a member, or leave | DELETE /v1/orgs/{orgId}/members/{userId} | Yes |
| Org API keys | GET /v1/orgs/{orgId}/keys | Sign in |
| Make an org API key (shown once) | POST /v1/orgs/{orgId}/keys | Sign in |
| Revoke an org API key | DELETE /v1/orgs/{orgId}/keys/{id} | Sign in |
| Data-deletion requests | GET /v1/orgs/{orgId}/deletion-requests | Yes |
| Ask us to delete stored inputs and results (within 24 hours) | POST /v1/orgs/{orgId}/deletion-requests | Sign in |
| Single sign-on settings (Max) | GET /v1/orgs/{orgId}/sso | Yes |
| Set up or change single sign-on (owners, Max) | PUT /v1/orgs/{orgId}/sso | Yes |
| Turn single sign-on off | DELETE /v1/orgs/{orgId}/sso | Yes |
| Audit log (Max) | GET /v1/orgs/{orgId}/audit-log | Yes |
| Try a job or an endpoint: test (free) or live (uses credits) | POST /v1/orgs/{orgId}/playground | Yes |
| Gateway endpoint calls | GET /v1/orgs/{orgId}/endpoint-calls | Yes |
| Segment scores (Pro and up) | GET /v1/orgs/{orgId}/segment-scores | Yes |
| Custom pass rules (Max) | GET /v1/orgs/{orgId}/pass-rules | Yes |
| Pinned and excluded tools | GET /v1/orgs/{orgId}/routing | Yes |
| Pin or exclude a tool (Pro and up) | PUT /v1/orgs/{orgId}/routing/{toolId} | Yes |
| Remove a routing rule | DELETE /v1/orgs/{orgId}/routing/{toolId} | Yes |
| Private test sets and included calls | GET /v1/orgs/{orgId}/test-sets | Yes |
| Private benchmark runs | GET /v1/orgs/{orgId}/benchmarks | Yes |
| One run: per-case results, segments, failure reasons | GET /v1/orgs/{orgId}/benchmarks/{id} | Yes |
| Make a private test set (JSON Lines) | POST /v1/orgs/{orgId}/test-sets | Yes |
| Add cases to a test set | POST /v1/orgs/{orgId}/test-sets/{id}/cases | Yes |
| Delete a test set and its results | DELETE /v1/orgs/{orgId}/test-sets/{id} | Yes |
| Run tools against a test set | POST /v1/orgs/{orgId}/benchmarks | Yes |
| Your tools' scores, inputs and rank (read-only) | GET /v1/orgs/{orgId}/provider | Yes |
| Claim a provider | POST /v1/orgs/{orgId}/provider/claims | Yes |
| Ask for a re-test (Insights, Pro) | POST /v1/orgs/{orgId}/provider/retests | Yes |
Rate limits
Public data: 120 requests a minute per IP. Sign-in emails: 20 an hour per IP. Agent keys: 600 a minute. Org endpoints: 300 a minute per org key or session. Every response carries RateLimit-* headers; over the limit you get 429 rate_limited with Retry-After.
Get an API key
A person signs in at arettic.com/app with an email link or Google. That creates the account with $1 of free credit, and the Connect page shows the key and how to plug it into Claude, Cursor, the API or the SDKs. Agents use the key; they don't create accounts.
Errors
Every error has the same shape. doc_url links to its entry on the error codes page, and retryable tells your agent whether to try again.
{ "error": { "code": "unauthenticated", "message": "Invalid or revoked API key", "doc_url": "https://arettic.com/docs/errors#unauthenticated", "retryable": false } }