Developer Documentation
Programmatic read access to Figgro's inventory and manufacturing data. Integrate product stock levels, raw material inventory, and production run data directly into your systems and agents.
Introduction
The Figgro API provides 3rd-party developers and AI agents with read access to inventory and manufacturing data from the Figgro ERP platform. All endpoints are read-only (GET) and return paginated JSON responses.
Base URL
https://developer.figgro.comAll endpoints are prefixed with /api/v1/. The base URL and versioning path will not change while on v1.
OpenAPI spec
The machine-readable spec is available at:
https://developer.figgro.com/swagger/v1/swagger.jsonQuick start
Contact integrations@figgro.com to request an API key. Keys are prefixed with fgr_ and expire every 12 months.
Pass the key in the X-Api-Key header on every request.
curl -X GET \ 'https://developer.figgro.com/api/v1/Inventory/getproducts?page=1' \ -H 'accept: application/json' \ -H 'X-Api-Key: fgr_your_key_here'
{
"page": 1,
"page_size": 25,
"total_records": 142,
"total_pages": 6,
"data": [ /* array of product objects */ ]
}Authentication
All requests must include a valid API key in the X-Api-Key request header. Requests without a key, or with an invalid key, return 401 Unauthorized.
X-Api-Key: fgr_your_key_here
| Property | Value |
|---|---|
| Header name | X-Api-Key |
| Key prefix | fgr_ |
| Key expiry | 12 months from issue date |
| Request new key | integrations@figgro.com |
Pagination
All list endpoints return paginated results using a consistent envelope. Use the page query parameter to navigate through results. Pages are 1-based.
| Field | Type | Description |
|---|---|---|
| page | integer | Current page number (1-based) |
| page_size | integer | Number of records in this page |
| total_records | integer | Total matching records across all pages |
| total_pages | integer | Total number of pages available |
| data | array | Records for this page |
Iterating all pages
async function getAllProducts() { const all = []; let page = 1, totalPages = 1; while (page <= totalPages) { const res = await fetch( `https://developer.figgro.com/api/v1/Inventory/getproducts?page=${page}`, { headers: { 'X-Api-Key': API_KEY } } ).then(r => r.json()); all.push(...res.data); totalPages = res.total_pages; page++; } return all; }
Endpoints
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| page | query | integer | optional | Page number, 1-based. Defaults to 1. |
Example request
curl -X GET \ 'https://developer.figgro.com/api/v1/Inventory/getproducts?page=1' \ -H 'X-Api-Key: fgr_your_key_here'
Response schema — data[]
Errors
All errors return a consistent JSON body with a machine-readable code and a human-readable message.
{
"code": "UNAUTHORIZED",
"message": "Invalid or missing X-Api-Key header."
}| Status | Code | Cause | Resolution |
|---|---|---|---|
| 400 | BAD_REQUEST | Malformed query parameters or invalid date format | Check parameter names, types, and ISO 8601 formatting |
| 401 | UNAUTHORIZED | Missing, invalid, or expired API key | Verify X-Api-Key header; request a new key if expired |
| 403 | FORBIDDEN | Key does not have access to the requested resource | Contact integrations@figgro.com to expand scope |
| 404 | NOT_FOUND | Endpoint does not exist or resource not found | Verify the URL and that the resource ID is correct |
| 429 | RATE_LIMITED | Exceeded 1,000 requests / hour | Back off and retry after the Retry-After interval |
| 500 | INTERNAL_ERROR | Unexpected server error | Retry with exponential backoff; report if persistent |
| 503 | UNAVAILABLE | Service temporarily unavailable for maintenance | Retry after a short delay |
Rate limits
API keys are limited to 1,000 requests per hour per key. Limits are enforced on a rolling 60-minute window. Responses include rate-limit headers so you can pace your traffic.
| Header | Description |
|---|---|
| X-RateLimit-Limit | Maximum requests allowed in the current window |
| X-RateLimit-Remaining | Requests remaining in the current window |
| X-RateLimit-Reset | Unix timestamp (UTC) when the window resets |
| Retry-After | Seconds to wait before retrying (only on 429 responses) |
Changelog
- Added lotNumber and expiryDate to /getrawmaterials
- Added labTestPassed and metrcSynced to job run tickets
- Added /getproductjobruntickets endpoint
- startDate / endDate filters available on all job endpoints
- Public launch — inventory and manufacturing read endpoints