Use a workspace API key as a Bearer token. Map fields once in Gluedly, then fetch clean JSON (with derived Markdown on each row) on your schedule or via webhooks.
HTTP API reference
Authentication, endpoints, and examples. Expand when you need the full reference.
Show
HTTP API reference
Authentication, endpoints, and examples. Expand when you need the full reference.
Send your secret key as a Bearer token. Deploy templates from the library to create pages, then use GET /pages to discover page_id values for execute. List endpoints return a paginated JSON payload (Laravel default format).
Base URL
https://gluedly.com/api/v1
Authentication
Include an Authorization header on every request:
Authorization: Bearer <your-api-key>
Example with curl:
curl -sS -H "Authorization: Bearer YOUR_KEY_HERE" "https://gluedly.com/api/v1/pages"
Endpoints
| Method | Path | Required scopes |
|---|---|---|
| GET | https://gluedly.com/api/v1/pages | index_pages |
| GET | https://gluedly.com/api/v1/pages/{id} | show_page (page must belong to your account) |
| GET | https://gluedly.com/api/v1/pages/{id}/data |
show_page
+ index_data
|
| POST | https://gluedly.com/api/v1/execute | execute_scrape (page must belong to your account) |
| GET | https://gluedly.com/api/v1/pages/{id}/data/{dataId} |
show_page
+ show_data
|
Replace {id} with a page ID from your account. Replace {dataId} with a row id from the data list response.
The single-data endpoint always returns a JSON array. If the row stores one associative object, it is returned as a one-element array; if it already stores a list, that list is returned unchanged.
Request / response examples
Illustrative values only. Paginated responses use Laravel default shape, including a links array; each link has url, label, page, active.
List pages — GET https://gluedly.com/api/v1/pages
Request
GET https://gluedly.com/api/v1/pages HTTP/1.1
Authorization: Bearer <your-api-key>
Accept: application/json
Response · 200
{
"current_page": 1,
"data": [
{
"id": 1,
"title": "Example page",
"url": "https://example.com",
"mark_excluded_xpaths": [],
"next_scrape_date": "2026-05-15T08:00:00.000000Z",
"user_id": 42,
"created_at": "2026-05-01T12:00:00.000000Z",
"updated_at": "2026-05-10T10:30:00.000000Z"
}
],
"first_page_url": "https://gluedly.com/api/v1/pages?page=1",
"from": 1,
"last_page": 1,
"last_page_url": "https://gluedly.com/api/v1/pages?page=1",
"next_page_url": null,
"path": "https://gluedly.com/api/v1/pages",
"per_page": 10,
"prev_page_url": null,
"to": 1,
"total": 1,
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "https://gluedly.com/api/v1/pages?page=1",
"label": "1",
"page": 1,
"active": true
},
{
"url": null,
"label": "Next »",
"page": null,
"active": false
}
]
}
Single page — GET https://gluedly.com/api/v1/pages/1
Request
GET https://gluedly.com/api/v1/pages/1 HTTP/1.1
Authorization: Bearer <your-api-key>
Accept: application/json
Response · 200
{
"id": 1,
"title": "Example page",
"url": "https://example.com",
"mark_excluded_xpaths": [
"/html/body/div[2]"
],
"next_scrape_date": "2026-05-15T08:00:00.000000Z",
"user_id": 42,
"created_at": "2026-05-01T12:00:00.000000Z",
"updated_at": "2026-05-10T10:30:00.000000Z"
}
List scraped rows for a page — GET https://gluedly.com/api/v1/pages/1/data
Request
GET https://gluedly.com/api/v1/pages/1/data HTTP/1.1
Authorization: Bearer <your-api-key>
Accept: application/json
Response · 200
{
"current_page": 1,
"data": [
{
"id": 100,
"page_id": 1,
"data": {
"ok": true,
"rows": [
{
"headline": "Example headline",
"price": "19.99",
"markdown": "# Example headline\n\n**price:** 19.99"
}
],
"match_counts": {
"headline": 1,
"price": 1
},
"warnings": []
},
"created_at": "2026-05-10T09:00:00.000000Z",
"updated_at": "2026-05-10T09:00:00.000000Z"
}
],
"first_page_url": "https://gluedly.com/api/v1/pages/1/data?page=1",
"from": 1,
"last_page": 1,
"last_page_url": "https://gluedly.com/api/v1/pages/1/data?page=1",
"next_page_url": null,
"path": "https://gluedly.com/api/v1/pages/1/data",
"per_page": 15,
"prev_page_url": null,
"to": 1,
"total": 1,
"links": [
{
"url": null,
"label": "« Previous",
"page": null,
"active": false
},
{
"url": "https://gluedly.com/api/v1/pages/1/data?page=1",
"label": "1",
"page": 1,
"active": true
},
{
"url": null,
"label": "Next »",
"page": null,
"active": false
}
]
}
Default page size for this list is 15 unless changed in code.
Each list item includes id so you can call GET /pages/{id}/data/{dataId} for that snapshot.
Each snapshot is normalized to the scrape envelope; when Markdown is enabled for the page, every row includes a derived markdown field for RAG and agent tooling.
Single scrape snapshot — GET https://gluedly.com/api/v1/pages/1/data/100
Request
GET https://gluedly.com/api/v1/pages/1/data/100 HTTP/1.1
Authorization: Bearer <your-api-key>
Accept: application/json
Request Accept: text/markdown (or ?format=markdown) to receive a plain Markdown document of all rows instead of JSON.
Response · 200
{
"id": 100,
"page_id": 1,
"data": {
"ok": true,
"rows": [
{
"headline": "Example headline",
"price": "19.99",
"markdown": "# Example headline\n\n**price:** 19.99"
}
],
"match_counts": {
"headline": 1,
"price": 1
},
"warnings": [
{
"code": "no_matches",
"field": "stock",
"message": "xpath for field \"stock\" matched no nodes"
}
]
},
"created_at": "2026-05-10T09:00:00.000000Z",
"updated_at": "2026-05-10T09:00:00.000000Z"
}
ok reflects whether the scraper map step succeeded. rows holds extracted field values (one object per matched list item). match_counts and warnings explain selector coverage; inspect them when fields are empty or counts differ.
Each row includes a derived markdown field built from your mapped values (unless you mapped a markdown field yourself).
Enable “Include Markdown in scrape results” in page settings to receive derived markdown (or Accept: text/markdown on a single snapshot).
Execute scrape — POST https://gluedly.com/api/v1/execute
Request
POST https://gluedly.com/api/v1/execute HTTP/1.1
Authorization: Bearer <your-api-key>
Content-Type: application/json
{
"page_id": 42,
"url": "https://docs.example.com/article/123"
}
Response · 200
{
"data": {
"ok": true,
"rows": [
{
"title": "Example headline",
"body": "Article text\u2026",
"markdown": "# Example headline\n\nArticle text\u2026"
}
],
"match_counts": {
"title": 1,
"body": 1
},
"warnings": []
},
"page_id": 42,
"data_id": 100
}
Runs the scrape synchronously for an existing page on your account, stores the result, and returns the same scrape envelope as the single-data endpoint under a top-level data key. url is optional; omit it to use the page's saved URL.
Errors
Missing or invalid token — 401
{
"message": "Unauthorized"
}
Insufficient scopes, wrong page owner, or unknown id — 403
{
"message": "This action is unauthorized."
}
Scope values (when creating a key)
-
index_pages— Pages List -
show_page— Single Page View -
index_data— Data List -
show_data— Single Data View -
execute_scrape— Execute Scrape