Dev tools Hub API
Source: Dev.to
What I Built
Submission for the Xano AI-Powered Backend Challenge: Production‑Ready Public API
Title: DevTools Resource Hub API
Available: True
DevTools APIs
- Xano Hub API
- Xano Assisted Production API
Software Backend Architecture

The backend follows a layered, modular design suitable for an MVP. API endpoints expose REST interfaces, protected by authentication, rate limiting, and validation. Core business logic is isolated into services such as search, recommendations, and scoring. A data‑access layer handles queries, caching, and transactions on PostgreSQL. Event handling and background jobs enable scalable, asynchronous integrations.



Caching Strategy Overview

Database Schema
tools
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| name | VARCHAR(255) | Unique, Not Null |
| slug | VARCHAR(255) | Unique, URL‑safe |
| category_id | INTEGER | FK → categories.id |
| description | TEXT | Tool description |
| tagline | VARCHAR(500) | Short marketing line |
| website_url | VARCHAR(500) | Official website |
| logo_url | VARCHAR(500) | Logo image URL |
| founded_date | DATE | Company founding date |
| company_name | VARCHAR(255) | Company behind the tool |
| is_active | BOOLEAN | Default: true |
| query_count | INTEGER | Default: 0 (trending score) |
| last_queried_at | TIMESTAMP | Last API query time |
| created_at | TIMESTAMP | Default: now() |
| updated_at | TIMESTAMP | Default: now() |
Indexes
category_idslugis_active(query_count, last_queried_at)
categories
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| name | VARCHAR(255) | Unique, Not Null |
| slug | VARCHAR(255) | Unique |
| parent_id | INTEGER | Self FK → categories.id |
| description | TEXT | Category description |
| icon | VARCHAR(100) | Icon identifier |
| display_order | INTEGER | Default: 0 |
| created_at | TIMESTAMP | Created timestamp |
Indexes
parent_idslug
pricing_tiers
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| tool_id | INTEGER | FK → tools.id (CASCADE) |
| tier_name | VARCHAR(100) | Free, Starter, Pro |
| monthly_price | DECIMAL(10,2) | Nullable |
| annual_price | DECIMAL(10,2) | Nullable |
| currency | VARCHAR(3) | Default: USD |
| billing_cycle | ENUM | monthly, annual, one-time |
| features_json | JSONB | Flexible features list |
| limits_json | JSONB | API limits, users, storage |
| is_current | BOOLEAN | Default: true |
| effective_from | TIMESTAMP | Pricing start |
| effective_to | TIMESTAMP | Nullable |
| created_at | TIMESTAMP | Created timestamp |
Indexes
(tool_id, is_current)(effective_from, effective_to)
alternatives
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| tool_id | INTEGER | FK → tools.id |
| alternative_id | INTEGER | FK → tools.id |
| similarity_score | DECIMAL(5,2) | Range: 0–100 |
| match_basis | ENUM | features, pricing, category |
| comparison_notes | TEXT | Comparison details |
| upvotes | INTEGER | Default: 0 |
| created_at | TIMESTAMP | Created timestamp |
| updated_at | TIMESTAMP | Updated timestamp |
Constraints
UNIQUE(tool_id, alternative_id)tool_id <> alternative_id
Indexes
tool_idsimilarity_score DESC
reviews_aggregate
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| tool_id | INTEGER | FK → tools.id |
| source | VARCHAR(50) | g2, capterra, producthunt |
| avg_rating | DECIMAL(3,2) | Range: 0–5 |
| total_reviews | INTEGER | Review count |
| rating_breakdown | JSONB | e.g. {5:120,4:45,...} |
| source_url | VARCHAR(500) | Review page URL |
| last_scraped_at | TIMESTAMP | Scraping time |
| created_at | TIMESTAMP | Created timestamp |
Indexes
(tool_id, source)avg_rating DESC
features
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| tool_id | INTEGER | FK → tools.id |
| feature_name | VARCHAR(255) | Feature title |
| feature_category | VARCHAR(100) | Auth, API, Database |
| is_available | BOOLEAN | Default: true |
| tier_availability | VARCHAR(50) | free, pro, all |
| description | TEXT | Feature details |
| created_at | TIMESTAMP | Created timestamp |
Indexes
tool_idfeature_categoryis_available
changelog
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| tool_id | INTEGER | FK → tools.id |
| change_type | ENUM | pricing, feature, update |
| change_summary | VARCHAR(500) | Short summary |
| change_details | TEXT | Detailed change |
| old_value | JSONB | Previous value |
| new_value | JSONB | Updated value |
| changed_at | TIMESTAMP | When change occurred |
| created_at | TIMESTAMP | Created timestamp |
Indexes
(tool_id, changed_at DESC)change_type
integrations
| Column | Type | Constraints / Description |
|---|---|---|
| id | SERIAL | Primary Key |
| tool_id | INTEGER | FK → tools.id |
| integrates_with | INTEGER | FK → tools.id |
| integration_type | ENUM | native, api, webhook, zapier |
| ease_of_setup | ENUM | easy, medium, complex |
| documentation_url | VARCHAR(500) | Docs link |
| is_official | BOOLEAN | Default: false |
| created_at | TIMESTAMP | Created timestamp |
Indexes
tool_idintegrates_with
API Documentation
Tools API
1️⃣ Get All Tools
Endpoint
GET /tools/
Query Parameters
| Parameter | Type | Description |
|---|---|---|
category | string (optional) | Filter by category |
price_min | number (optional) | Minimum price |
price_max | number (optional) | Maximum price |
features | array of strings (optional) | Required features |
sort | string (default: “name”) | Sorting field |
page | number (default: 1) | Page number |
size | number (default: 10) | Page size |
Response Example
{
"items": [
{
"id": 1,
"name": "VS Code",
"slug": "vs-code",
"category_id": 3,
"description": "Free source‑code editor",
"website_url": "https://code.visualstudio.com/",
"logo_url": "https://example.com/logo.png",
"is_active": true,
"query_count": 124,
"last_queried_at": "2025-11-01T12:34:56Z"
}
// …more tools
],
"page": 1,
"size": 10,
"total_items": 342,
"total_pages": 35
}
2️⃣ Get Tool Details
Endpoint
GET /tools/{id}/
Path Parameter
id– Integer ID of the tool.
Response Example
{
"id": 1,
"name": "VS Code",
"slug": "vs-code",
"category": {
"id": 3,
"name": "IDE"
},
"description": "Free source‑code editor",
"website_url": "https://code.visualstudio.com/",
"logo_url": "https://example.com/logo.png",
"features": [
{ "name": "IntelliSense", "available": true },
{ "name": "Debugging", "available": true }
],
"pricing_tiers": [
{ "tier_name": "Free", "monthly_price": null, "annual_price": null }
],
"reviews": {
"avg_rating": 4.7,
"total_reviews": 215
}
}
3️⃣ Search Tools
Endpoint
GET /tools/search/
Query Parameters
| Parameter | Type | Description |
|---|---|---|
q | string | Search term (name, tagline, etc.) |
page | number | Page number (default 1) |
size | number | Page size (default 10) |
Response – Same structure as Get All Tools but filtered by the search term.
Categories API
Endpoint
GET /categories/
Returns a list of tool categories with their hierarchy.
Pricing Tiers API
Endpoint
GET /tools/{id}/pricing/
Provides current and historical pricing information for a specific tool.
Alternatives API
Endpoint
GET /tools/{id}/alternatives/
Returns a ranked list of alternative tools based on similarity score.
Reviews Aggregate API
Endpoint
GET /tools/{id}/reviews/
Aggregates ratings from external sources (G2, Capterra, Product Hunt).
Features API
Endpoint
GET /tools/{id}/features/
Lists all features of a tool, grouped by category and tier availability.
Changelog API
Endpoint
GET /tools/{id}/changelog/
Provides a chronological list of changes (pricing, features, updates).
Integrations API
Endpoint
GET /tools/{id}/integrations/
Shows native and third‑party integrations for the tool.