Overview
Arettic gives an agent one key for sales and research data tools. It recommends the tool that works for a task, runs it, checks the result against a published rule and charges only if it passes.
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_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-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_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-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_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 and get_balance. Server card: /.well-known/mcp.json.
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 |
| List agents | GET /v1/orgs/{orgId}/agents | Yes |
| Add an agent (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 credits (returns a checkout link) | 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 the Pro plan (returns a checkout link) | POST /v1/orgs/{orgId}/subscriptions | 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 |
| 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 |
| 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. Waitlist: 10 an hour 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.
Join the waitlist from an agent
curl https://api.arettic.com/v1/waitlist \
-H "Content-Type: application/json" \
-d '{ "email": "[email protected]", "use_case": "lead research agent" }'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
}
}