GrootMade

API Reference

Integrate GrootMade with your applications

API Reference

Programmatically access GrootMade features through our REST API.

API Access

API access requires Pro plan or higher. Find your API key at Dashboard → Settings → API Keys.

Authentication

All API requests require authentication via Bearer token:

curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://api.grootmade.com/v1/products

Base URL

https://api.grootmade.com/v1

Rate Limits

PlanRequests/Hour
Pro1,000
Agency10,000
EnterpriseUnlimited

Rate limit headers are included in responses:

X-RateLimit-Limit: 1000
X-RateLimit-Remaining: 999
X-RateLimit-Reset: 1609459200

Endpoints

Products

List Products

GET /products

Parameters:

ParameterTypeDescription
typestringtheme or plugin
categorystringCategory slug
searchstringSearch query
pageintegerPage number (default: 1)
per_pageintegerResults per page (max: 100)

Response:

{
  "data": [
    {
      "id": "prod_abc123",
      "name": "Premium Theme",
      "slug": "premium-theme",
      "type": "theme",
      "version": "2.5.0",
      "updated_at": "2026-01-10T12:00:00Z",
      "download_url": "https://..."
    }
  ],
  "meta": {
    "current_page": 1,
    "total_pages": 50,
    "total_count": 5000
  }
}

Get Product

GET /products/{id}

Response:

{
  "id": "prod_abc123",
  "name": "Premium Theme",
  "slug": "premium-theme",
  "type": "theme",
  "version": "2.5.0",
  "description": "A premium theme for...",
  "categories": ["business", "corporate"],
  "compatibility": {
    "wordpress": "6.0+",
    "php": "7.4+"
  },
  "changelog": [...],
  "download_url": "https://..."
}

Download Product

POST /products/{id}/download

Response:

{
  "download_url": "https://cdn.grootmade.com/...",
  "expires_at": "2026-01-13T13:00:00Z",
  "file_size": 2048576
}

Collections

List Collections

GET /collections

Get Collection

GET /collections/{id}

Download Collection

POST /collections/{id}/download

Sites

List Connected Sites

GET /sites

Add Site

POST /sites

Body:

{
  "url": "https://example.com",
  "name": "My Site"
}

Remove Site

DELETE /sites/{id}

Install Product to Site

POST /sites/{site_id}/install

Body:

{
  "product_id": "prod_abc123",
  "activate": true
}

Updates

Check for Updates

POST /updates/check

Body:

{
  "products": [
    {"slug": "theme-name", "version": "1.0.0"},
    {"slug": "plugin-name", "version": "2.0.0"}
  ]
}

Response:

{
  "updates": [
    {
      "slug": "plugin-name",
      "current_version": "2.0.0",
      "new_version": "2.1.0",
      "download_url": "https://..."
    }
  ]
}

AI Suggestions

Get Suggestions

POST /suggest

Body:

{
  "site_url": "https://example.com",
  "goal": "ecommerce"
}

Response:

{
  "suggestions": [
    {
      "product_id": "prod_xyz",
      "name": "WooCommerce Extension",
      "match_score": 95,
      "reason": "Essential for e-commerce sites"
    }
  ]
}

Webhooks

Receive real-time notifications for events.

Configure Webhooks

Go to Dashboard → Settings → Webhooks to add endpoints.

Events

EventDescription
product.updatedProduct has a new version
download.completedDownload finished
site.connectedNew site connected
subscription.changedPlan changed

Payload

{
  "event": "product.updated",
  "timestamp": "2026-01-13T12:00:00Z",
  "data": {
    "product_id": "prod_abc123",
    "old_version": "1.0.0",
    "new_version": "1.1.0"
  }
}

Verification

Verify webhook signatures:

const crypto = require('crypto');

function verifyWebhook(payload, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
  return signature === `sha256=${expected}`;
}

SDKs

JavaScript/Node.js

npm install @grootmade/sdk
import { GrootMade } from '@grootmade/sdk';

const client = new GrootMade('YOUR_API_KEY');

const products = await client.products.list({ type: 'plugin' });

PHP

composer require grootmade/sdk
use GrootMade\Client;

$client = new Client('YOUR_API_KEY');

$products = $client->products()->list(['type' => 'plugin']);

Error Handling

Errors return appropriate HTTP status codes:

CodeDescription
400Bad Request
401Unauthorized
403Forbidden
404Not Found
429Rate Limited
500Server Error

Error response format:

{
  "error": {
    "code": "invalid_api_key",
    "message": "The API key provided is invalid."
  }
}

On this page