Browse all guides

Quickstart

The Growee REST API lives at your workspace’s own subdomain:

https://<your-company>.growee.net/api/restify

<your-company> is the part before .growee.net in the URL you use to sign in to Growee.

1. Create an API key

In Growee, go to Settings → Integrations → API Keys and create a key. Pick the permission scopes the key needs (for example Manage timesheets to log time) and optionally restrict it to your server’s IP addresses.

The full key is shown once when you create it. Store it in a secret manager - you can regenerate it later, but never read it again.

See Authentication for how scopes and IP allowlists behave.

2. Make your first request

List five employees:

curl "https://your-company.growee.net/api/restify/employees?perPage=5" \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Accept: application/json"

The same request in JavaScript:

const response = await fetch(
  'https://your-company.growee.net/api/restify/employees?perPage=5',
  {
    headers: {
      Authorization: `Bearer ${process.env.GROWEE_API_KEY}`,
      Accept: 'application/json',
    },
  },
)

const { data, meta } = await response.json()

And in PHP:

$response = Http::withToken(config('services.growee.key'))
    ->acceptJson()
    ->get('https://your-company.growee.net/api/restify/employees', [
        'perPage' => 5,
    ]);

$employees = $response->json('data');

3. Read the response

Every list endpoint returns the same envelope:

{
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 9,
    "path": "https://your-company.growee.net/api/restify/employees",
    "per_page": 5,
    "to": 5,
    "total": 42
  },
  "links": {
    "first": "...?page=1",
    "prev": null,
    "next": "...?page=2"
  },
  "data": [
    {
      "id": "01j2xw6ykq3f8p9r0v5m7n8s4t",
      "type": "employees",
      "attributes": {
        "first_name": "Sarah",
        "last_name": "Mitchell",
        "company_email": "sarah.mitchell@your-company.com"
      },
      "meta": {
        "authorizedToShow": true,
        "authorizedToUpdate": false
      }
    }
  ]
}

Things to know:

  • IDs are ULIDs - 26-character sortable strings, not integers.
  • data[].attributes holds the fields; the exact set depends on your key’s permissions.
  • data[].meta tells you what the key may do with each record.
  • Single-record endpoints (GET /employees/{id}) return { "data": { ... } } without pagination.

4. Create something

Log a timesheet entry:

curl -X POST "https://your-company.growee.net/api/restify/timesheets" \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "project_id": "01j2xw...",
    "task_id": "01j2xx...",
    "worked_minutes": 90,
    "date": "2026-07-14",
    "description": "API integration work"
  }'

A successful create returns 201 with the new record; validation problems return 422 with per-field messages - see Errors & validation.

Next steps

The Growee API is built on the open-source Laravel Restify framework - its documentation covers the shared query language (filters, search, sorting, pagination) in more depth.

Questions about the API? Contact support or email support@growee.net.