openclaw-crawleo-skill 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,237 @@
1
+ {
2
+ "schema_version": "1.0.0",
3
+ "base_url": "https://api.crawleo.dev",
4
+ "auth": {
5
+ "primary_header": "x-api-key",
6
+ "primary_env_var": "CRAWLEO_API_KEY",
7
+ "alternate_header": "Authorization: Bearer YOUR_API_KEY",
8
+ "secret_handling": "Never print, log, echo, or persist API key values."
9
+ },
10
+ "source_policy": {
11
+ "primary": "Crawleo endpoint-specific documentation",
12
+ "secondary": "Crawleo docs index, MCP overview, authentication docs, API introduction, and OpenAPI snapshot where it agrees",
13
+ "ambiguity_phrase": "not specified in Crawleo docs",
14
+ "notes": [
15
+ "Endpoint-specific docs are used where OpenAPI omits documented endpoints.",
16
+ "The local OpenAPI snapshot lists /search, /google-maps, and /crawl only; endpoint docs also document /google-search and /headful-browser."
17
+ ]
18
+ },
19
+ "mcp": {
20
+ "endpoint": "https://api.crawleo.dev/mcp",
21
+ "source": {
22
+ "path": ".gsd/research/crawleo-docs/md/overview.md",
23
+ "url": "https://docs.crawleo.dev/mcp/overview.md"
24
+ },
25
+ "tools": [
26
+ { "name": "search_web", "maps_to_endpoint": "/search", "documented_cost": "10 credits per page of results" },
27
+ { "name": "google_search", "maps_to_endpoint": "/google-search", "documented_cost": "10 credits per request" },
28
+ { "name": "google_maps", "maps_to_endpoint": "/google-maps", "documented_cost": "10 credits per request in MCP overview; conflicts with endpoint doc cost of 30 credits per request" },
29
+ { "name": "crawl_web", "maps_to_endpoint": "/crawl", "documented_cost": "1 credit per URL for HTTP request; 10 credits per URL for browser rendering" },
30
+ { "name": "headful_browser", "maps_to_endpoint": "/headful-browser", "documented_cost": "50 credits per URL" }
31
+ ]
32
+ },
33
+ "endpoints": [
34
+ {
35
+ "id": "search",
36
+ "name": "Bing Search API",
37
+ "method": "GET",
38
+ "path": "/search",
39
+ "url": "https://api.crawleo.dev/search",
40
+ "mcp_tool": "search_web",
41
+ "description": "Bing-powered real-time web search with optional auto-crawling and page content extraction for LLM/RAG workflows.",
42
+ "sources": [
43
+ { "path": ".gsd/research/crawleo-docs/md/search.md", "url": "https://docs.crawleo.dev/api-reference/endpoint/search.md" },
44
+ { "path": ".gsd/research/crawleo-docs/md/overview.md", "url": "https://docs.crawleo.dev/mcp/overview.md" },
45
+ { "path": ".gsd/research/crawleo-docs/openapi.json.json", "url": "https://docs.crawleo.dev/openapi.json" }
46
+ ],
47
+ "cost": "10 credits per page via max_pages / MCP search_web cost; exact cost for example-only count parameter is not specified in Crawleo docs",
48
+ "parameters": [
49
+ { "in": "header", "name": "x-api-key", "type": "string", "required": true, "default": null, "limits_or_enum": null, "description": "Crawleo API key; Authorization Bearer is documented as an alternative." },
50
+ { "in": "query", "name": "query", "type": "string", "required": true, "default": null, "limits_or_enum": null, "description": "Search query string." },
51
+ { "in": "query", "name": "max_pages", "type": "integer", "required": false, "default": 1, "limits_or_enum": "not specified in Crawleo docs", "description": "Maximum number of result pages to fetch; each page costs 10 credits." },
52
+ { "in": "query", "name": "setLang", "type": "string", "required": false, "default": null, "limits_or_enum": "examples: en, es, fr, de", "description": "Language code for search results." },
53
+ { "in": "query", "name": "cc", "type": "string", "required": false, "default": null, "limits_or_enum": "examples: US, GB, DE", "description": "Country code for search results." },
54
+ { "in": "query", "name": "geolocation", "type": "string", "required": false, "default": null, "limits_or_enum": "random is documented", "description": "Geographic location for localized results." },
55
+ { "in": "query", "name": "device", "type": "string", "required": false, "default": "desktop", "limits_or_enum": ["desktop", "mobile", "tablet"], "description": "Device type to simulate." },
56
+ { "in": "query", "name": "copilot_answer", "type": "boolean", "required": false, "default": true, "limits_or_enum": null, "description": "Include Copilot answers." },
57
+ { "in": "query", "name": "questions_answers", "type": "boolean", "required": false, "default": true, "limits_or_enum": null, "description": "Include People Also Ask question-answer cards." },
58
+ { "in": "query", "name": "related_queries", "type": "boolean", "required": false, "default": true, "limits_or_enum": null, "description": "Include related search query suggestions." },
59
+ { "in": "query", "name": "sidebar", "type": "boolean", "required": false, "default": true, "limits_or_enum": null, "description": "Include sidebar data such as knowledge panels and local results." },
60
+ { "in": "query", "name": "direct_answer", "type": "boolean", "required": false, "default": true, "limits_or_enum": null, "description": "Include direct answer boxes and instant answers." },
61
+ { "in": "query", "name": "raw_html", "type": "boolean", "required": false, "default": false, "limits_or_enum": null, "description": "Return original HTML source of each result page." },
62
+ { "in": "query", "name": "enhanced_html", "type": "boolean", "required": false, "default": false, "limits_or_enum": null, "description": "Return cleaned HTML with ads, scripts, and tracking removed." },
63
+ { "in": "query", "name": "page_text", "type": "boolean", "required": false, "default": false, "limits_or_enum": null, "description": "Return extracted plain text from each result page." },
64
+ { "in": "query", "name": "markdown", "type": "boolean", "required": false, "default": false, "limits_or_enum": null, "description": "Return structured Markdown." },
65
+ { "in": "query", "name": "auto_crawling", "type": "boolean", "required": false, "default": false, "limits_or_enum": null, "description": "Automatically crawl each search result URL and include page content." },
66
+ { "in": "query", "name": "count", "type": "integer", "required": false, "default": "not specified in Crawleo docs", "limits_or_enum": "not specified in Crawleo docs", "description": "Appears in Crawleo example requests but not in the visible parameter table." }
67
+ ],
68
+ "examples": [
69
+ { "label": "Basic search", "request": "GET /search?query=machine%20learning&count=10" },
70
+ { "label": "Markdown auto-crawling", "request": "GET /search?query=AI%20agents&auto_crawling=true&markdown=true" }
71
+ ],
72
+ "response_shape": {
73
+ "top_level_fields": ["query", "pages_fetched", "pages", "total_results", "search_results", "related_queries", "credits"],
74
+ "result_fields": ["title", "link", "date", "snippet", "source", "page_content", "enhanced_html", "page_markdown"]
75
+ },
76
+ "errors": "not specified in Crawleo docs",
77
+ "ambiguities": [
78
+ "The `count` query parameter appears in examples but is not listed in the visible parameter table.",
79
+ "Search endpoint error response table is not specified in Crawleo docs."
80
+ ]
81
+ },
82
+ {
83
+ "id": "google_search",
84
+ "name": "Google Search API",
85
+ "method": "GET",
86
+ "path": "/google-search",
87
+ "url": "https://api.crawleo.dev/google-search",
88
+ "mcp_tool": "google_search",
89
+ "description": "Real-time Google SERP data including web, news, images, places, shopping, knowledge graph, People Also Ask, related searches, and answer boxes.",
90
+ "sources": [
91
+ { "path": ".gsd/research/crawleo-docs/md/google-search.md", "url": "https://docs.crawleo.dev/api-reference/endpoint/google-search.md" },
92
+ { "path": ".gsd/research/crawleo-docs/md/overview.md", "url": "https://docs.crawleo.dev/mcp/overview.md" }
93
+ ],
94
+ "cost": "10 credits per request",
95
+ "parameters": [
96
+ { "in": "header", "name": "x-api-key", "type": "string", "required": true, "default": null, "limits_or_enum": null, "description": "Crawleo API key; Authorization Bearer is documented as an alternative." },
97
+ { "in": "query", "name": "q", "type": "string", "required": true, "default": null, "limits_or_enum": null, "description": "Search query." },
98
+ { "in": "query", "name": "gl", "type": "string", "required": false, "default": "us", "limits_or_enum": "ISO 3166-1 alpha-2 examples: us, gb, eg, de, fr", "description": "Country for search results." },
99
+ { "in": "query", "name": "hl", "type": "string", "required": false, "default": "en", "limits_or_enum": "IETF language tag examples: en, ar, fr, de", "description": "Language for results." },
100
+ { "in": "query", "name": "tbs", "type": "string", "required": false, "default": null, "limits_or_enum": ["qdr:h", "qdr:d", "qdr:w", "qdr:m", "qdr:y"], "description": "Time-based freshness filter." },
101
+ { "in": "query", "name": "page", "type": "integer", "required": false, "default": 1, "limits_or_enum": "1-indexed; upper bound not specified in Crawleo docs", "description": "Page number of results." },
102
+ { "in": "query", "name": "num", "type": "integer", "required": false, "default": 10, "limits_or_enum": "1-100", "description": "Number of results per page." },
103
+ { "in": "query", "name": "type", "type": "string", "required": false, "default": "search", "limits_or_enum": ["search", "news", "images", "places", "shopping"], "description": "Google result vertical." }
104
+ ],
105
+ "examples": [
106
+ { "label": "Basic Google search", "request": "GET /google-search?q=best%20CRM%20software&gl=us&hl=en&num=10" },
107
+ { "label": "News search", "request": "GET /google-search?q=AI&type=news&tbs=qdr:d" },
108
+ { "label": "Places search", "request": "GET /google-search?q=coffee&type=places&gl=us" },
109
+ { "label": "Shopping search", "request": "GET /google-search?q=laptop&type=shopping" }
110
+ ],
111
+ "response_shape": {
112
+ "top_level_fields": ["parameters", "google_search_results", "knowledgeGraph", "peopleAlsoAsk", "relatedSearches", "answerBox"],
113
+ "result_fields": ["title", "link", "snippet", "position"]
114
+ },
115
+ "errors": [
116
+ { "status": 400, "description": "Missing required parameter `q`" },
117
+ { "status": 401, "description": "Invalid or missing API key" },
118
+ { "status": 402, "description": "Insufficient credits" },
119
+ { "status": 429, "description": "Rate limit exceeded" },
120
+ { "status": 500, "description": "Internal server error" }
121
+ ],
122
+ "ambiguities": ["Google Search is documented in endpoint-specific docs and docs index but absent from the local OpenAPI snapshot."]
123
+ },
124
+ {
125
+ "id": "google_maps",
126
+ "name": "Google Maps API",
127
+ "method": "GET",
128
+ "path": "/google-maps",
129
+ "url": "https://api.crawleo.dev/google-maps",
130
+ "mcp_tool": "google_maps",
131
+ "description": "Google Maps business/place/landmark search with structured place data.",
132
+ "sources": [
133
+ { "path": ".gsd/research/crawleo-docs/md/google-maps.md", "url": "https://docs.crawleo.dev/api-reference/endpoint/google-maps.md" },
134
+ { "path": ".gsd/research/crawleo-docs/md/overview.md", "url": "https://docs.crawleo.dev/mcp/overview.md" },
135
+ { "path": ".gsd/research/crawleo-docs/openapi.json.json", "url": "https://docs.crawleo.dev/openapi.json" }
136
+ ],
137
+ "cost": "Endpoint doc: 30 credits per request. MCP overview: 10 credits per request. Preserve as source conflict.",
138
+ "parameters": [
139
+ { "in": "header", "name": "x-api-key", "type": "string", "required": true, "default": null, "limits_or_enum": null, "description": "Crawleo API key; Authorization Bearer is documented as an alternative." },
140
+ { "in": "query", "name": "q", "type": "string", "required": true, "default": null, "limits_or_enum": null, "description": "Business name, landmark, address, keyword, or category + location query." },
141
+ { "in": "query", "name": "hl", "type": "string", "required": false, "default": "not specified in Crawleo docs", "limits_or_enum": "ISO 639-1 examples: en, ar, fr, de", "description": "Language code for returned text." },
142
+ { "in": "query", "name": "ll", "type": "string", "required": false, "default": null, "limits_or_enum": "format @latitude,longitude,zoomz; zoom 1z-21z", "description": "Location bias." },
143
+ { "in": "query", "name": "placeId", "type": "string", "required": false, "default": null, "limits_or_enum": null, "description": "Google Place ID for exact place lookup." },
144
+ { "in": "query", "name": "cid", "type": "string", "required": false, "default": null, "limits_or_enum": null, "description": "Google numeric business/customer ID for exact business lookup." }
145
+ ],
146
+ "parameter_combinations": ["q", "q + hl", "q + ll", "q + ll + hl", "q + placeId", "q + placeId + hl", "q + cid", "q + cid + hl"],
147
+ "examples": [
148
+ { "label": "Basic Maps search", "request": "GET /google-maps?q=restaurants%20in%20Paris&hl=fr" },
149
+ { "label": "Location-biased search", "request": "GET /google-maps?q=coffee%20shops&ll=%4048.8566%2C2.3522%2C15z&hl=fr" },
150
+ { "label": "Place lookup", "request": "GET /google-maps?q=Le%20Comptoir&placeId=ChIJLU7jZClu5kcR4PcOOO6p3I0" }
151
+ ],
152
+ "response_shape": {
153
+ "top_level_fields": ["parameters", "google_maps_results", "credits"],
154
+ "result_fields": ["position", "title", "address", "rating", "ratingCount", "phoneNumber", "website", "type", "types", "priceLevel", "placeId", "cid", "latitude", "longitude", "openingHours", "thumbnailUrl"]
155
+ },
156
+ "errors": [
157
+ { "status": 400, "description": "Missing required query parameter `q`" },
158
+ { "status": 401, "description": "Invalid or missing API key" },
159
+ { "status": 403, "description": "Inactive account or expired subscription" },
160
+ { "status": 429, "description": "Credits exhausted or concurrent request limit reached" },
161
+ { "status": 500, "description": "Internal server error" }
162
+ ],
163
+ "ambiguities": ["Google Maps cost differs between endpoint doc and MCP overview.", "Default for `hl` is not specified in Crawleo docs."]
164
+ },
165
+ {
166
+ "id": "crawl",
167
+ "name": "Crawler API",
168
+ "method": "GET",
169
+ "path": "/crawl",
170
+ "url": "https://api.crawleo.dev/crawl",
171
+ "mcp_tool": "crawl_web",
172
+ "description": "Direct URL crawling API with optional JavaScript rendering, content extraction, screenshots, and multiple output formats.",
173
+ "sources": [
174
+ { "path": ".gsd/research/crawleo-docs/md/crawler.md", "url": "https://docs.crawleo.dev/api-reference/endpoint/crawler.md" },
175
+ { "path": ".gsd/research/crawleo-docs/md/overview.md", "url": "https://docs.crawleo.dev/mcp/overview.md" },
176
+ { "path": ".gsd/research/crawleo-docs/openapi.json.json", "url": "https://docs.crawleo.dev/openapi.json" }
177
+ ],
178
+ "cost": "1 credit per URL when render_js=false; 10 credits per URL when render_js=true",
179
+ "parameters": [
180
+ { "in": "header", "name": "x-api-key", "type": "string", "required": true, "default": null, "limits_or_enum": null, "description": "Crawleo API key; Authorization Bearer is documented as an alternative." },
181
+ { "in": "query", "name": "urls", "type": "string", "required": true, "default": null, "limits_or_enum": "single URL or comma-separated URLs", "description": "URL or URLs to crawl." },
182
+ { "in": "query", "name": "render_js", "type": "boolean", "required": false, "default": false, "limits_or_enum": null, "description": "Enable browser rendering; changes cost from 1 to 10 credits per URL." },
183
+ { "in": "query", "name": "geolocation", "type": "string", "required": false, "default": null, "limits_or_enum": "ISO 3166-1 alpha-2 examples: us, gb, de", "description": "Country code for geolocation." },
184
+ { "in": "query", "name": "raw_html", "type": "boolean", "required": false, "default": false, "limits_or_enum": null, "description": "Return raw HTML." },
185
+ { "in": "query", "name": "enhanced_html", "type": "boolean", "required": false, "default": true, "limits_or_enum": null, "description": "Return cleaned/sanitized HTML." },
186
+ { "in": "query", "name": "page_text", "type": "boolean", "required": false, "default": false, "limits_or_enum": null, "description": "Return plain text extraction." },
187
+ { "in": "query", "name": "markdown", "type": "boolean", "required": false, "default": true, "limits_or_enum": null, "description": "Return Markdown conversion." },
188
+ { "in": "query", "name": "screenshot", "type": "boolean", "required": false, "default": false, "limits_or_enum": "only available when render_js=true", "description": "Capture screenshot." },
189
+ { "in": "query", "name": "screenshot_full_page", "type": "boolean", "required": false, "default": false, "limits_or_enum": "screenshot=true and render_js=true required for screenshot output", "description": "Capture full-page screenshot instead of viewport only." }
190
+ ],
191
+ "examples": [
192
+ { "label": "Basic crawl with Markdown", "request": "GET /crawl?urls=https://example.com&markdown=true" },
193
+ { "label": "Rendered crawl with screenshot", "request": "GET /crawl?urls=https://example.com&render_js=true&screenshot=true" }
194
+ ],
195
+ "response_shape": {
196
+ "top_level_fields": ["results", "credits", "successful_pages"],
197
+ "result_fields": ["url", "status_code", "raw_html", "enhanced_html", "markdown", "page_text", "screenshot", "error"]
198
+ },
199
+ "errors": "not specified in Crawleo docs",
200
+ "ambiguities": ["Crawler endpoint error response table is not specified in Crawleo docs."]
201
+ },
202
+ {
203
+ "id": "headful_browser",
204
+ "name": "Headful Browser API",
205
+ "method": "GET",
206
+ "path": "/headful-browser",
207
+ "url": "https://api.crawleo.dev/headful-browser",
208
+ "mcp_tool": "headful_browser",
209
+ "description": "Premium headed browser crawling with anti-bot evasion, SOAX residential proxies, screenshots, and multiple output formats.",
210
+ "sources": [
211
+ { "path": ".gsd/research/crawleo-docs/md/headful-browser.md", "url": "https://docs.crawleo.dev/api-reference/endpoint/headful-browser.md" },
212
+ { "path": ".gsd/research/crawleo-docs/md/overview.md", "url": "https://docs.crawleo.dev/mcp/overview.md" }
213
+ ],
214
+ "cost": "50 credits per URL; failed requests cost 0 credits",
215
+ "parameters": [
216
+ { "in": "header", "name": "x-api-key", "type": "string", "required": true, "default": null, "limits_or_enum": null, "description": "Crawleo API key; Authorization Bearer is documented as an alternative." },
217
+ { "in": "query", "name": "urls", "type": "string", "required": true, "default": null, "limits_or_enum": "single URL or comma-separated URLs", "description": "One or more URLs to crawl." },
218
+ { "in": "query", "name": "country", "type": "string", "required": false, "default": "us", "limits_or_enum": "examples: us, gb, de, fr, jp, in, br, ca, au, and more", "description": "Residential proxy geolocation country code." },
219
+ { "in": "query", "name": "output_format", "type": "string", "required": false, "default": "markdown", "limits_or_enum": ["markdown", "enhanced_html", "raw_html", "page_text"], "description": "Output format for crawled page content." },
220
+ { "in": "query", "name": "screenshot", "type": "boolean", "required": false, "default": false, "limits_or_enum": null, "description": "Capture full-page screenshot returned as URL." }
221
+ ],
222
+ "examples": [
223
+ { "label": "Basic headful crawl", "request": "GET /headful-browser?urls=https://example.com&output_format=markdown" },
224
+ { "label": "Headful crawl with screenshot", "request": "GET /headful-browser?urls=https://example.com&screenshot=true" }
225
+ ],
226
+ "response_shape": {
227
+ "top_level_fields": ["status", "data", "credits_used", "credits_remaining"],
228
+ "result_fields": ["url", "markdown", "raw_html", "enhanced_html", "page_text", "screenshot", "blocked"]
229
+ },
230
+ "errors": "not specified in Crawleo docs",
231
+ "ambiguities": [
232
+ "Headful Browser is documented in endpoint-specific docs and docs index but absent from the local OpenAPI snapshot.",
233
+ "Headful Browser endpoint error response table is not specified in Crawleo docs."
234
+ ]
235
+ }
236
+ ]
237
+ }
@@ -0,0 +1,268 @@
1
+ # Crawleo Endpoint Contract Inventory
2
+
3
+ This contract inventory is the S01 handoff artifact for downstream implementation and documentation. It is source-backed by Crawleo endpoint-specific docs, the Crawleo MCP overview, the Crawleo docs index, authentication docs, and the local OpenAPI snapshot.
4
+
5
+ ## Contract Rules
6
+
7
+ - Base REST URL: `https://api.crawleo.dev`
8
+ - Primary authentication: `CRAWLEO_API_KEY` sent as `x-api-key`.
9
+ - Alternate authentication documented by Crawleo: `Authorization: Bearer YOUR_API_KEY`.
10
+ - Never print, log, echo, or persist API key values.
11
+ - Endpoint-specific Crawleo docs are authoritative where the local OpenAPI snapshot is narrower.
12
+ - Missing defaults, ranges, error tables, or unclear example-only fields must say: `not specified in Crawleo docs`.
13
+ - Default verification must not call Crawleo or consume credits.
14
+
15
+ ## Source Conflict Summary
16
+
17
+ - Endpoint docs and docs index cover `/search`, `/google-search`, `/google-maps`, `/crawl`, and `/headful-browser`.
18
+ - Local OpenAPI snapshot covers only `/search`, `/google-maps`, and `/crawl`.
19
+ - `/google-search` and `/headful-browser` remain in scope because Crawleo endpoint docs and docs index document them.
20
+ - Google Maps cost conflicts by source: endpoint doc says 30 credits per request; MCP overview says 10 credits per request.
21
+ - `/search` examples include `count=10`, but the visible parameter table does not list `count`; treat `count` as example-only/ambiguous until verified.
22
+
23
+ ## MCP Mapping
24
+
25
+ MCP endpoint: `https://api.crawleo.dev/mcp`
26
+
27
+ | MCP Tool | REST Endpoint | Documented Cost |
28
+ |---|---|---|
29
+ | `search_web` | `/search` | 10 credits per page of results |
30
+ | `google_search` | `/google-search` | 10 credits per request |
31
+ | `google_maps` | `/google-maps` | 10 credits per request in MCP overview; conflicts with endpoint doc cost of 30 credits per request |
32
+ | `crawl_web` | `/crawl` | 1 credit per URL for HTTP request; 10 credits per URL for browser rendering |
33
+ | `headful_browser` | `/headful-browser` | 50 credits per URL |
34
+
35
+ ## Endpoint Contracts
36
+
37
+ ### `/search` — Bing Search API
38
+
39
+ - Method: `GET`
40
+ - URL: `https://api.crawleo.dev/search`
41
+ - MCP tool: `search_web`
42
+ - Purpose: Bing-powered real-time web search with optional auto-crawling and content extraction for LLM/RAG workflows.
43
+ - Sources:
44
+ - `.gsd/research/crawleo-docs/md/search.md` / `https://docs.crawleo.dev/api-reference/endpoint/search.md`
45
+ - `.gsd/research/crawleo-docs/md/overview.md` / `https://docs.crawleo.dev/mcp/overview.md`
46
+ - `.gsd/research/crawleo-docs/openapi.json.json` / `https://docs.crawleo.dev/openapi.json`
47
+ - Cost: 10 credits per page via `max_pages` / MCP `search_web` cost. Exact cost behavior for example-only `count` is `not specified in Crawleo docs`.
48
+
49
+ #### Parameters
50
+
51
+ | Location | Name | Type | Required | Default | Limits / Enum | Notes |
52
+ |---|---|---:|---:|---|---|---|
53
+ | header | `x-api-key` | string | yes | — | — | Crawleo API key; Bearer auth is also documented. |
54
+ | query | `query` | string | yes | — | — | Search query string. |
55
+ | query | `max_pages` | integer | no | `1` | `not specified in Crawleo docs` | Maximum pages to fetch; each page costs 10 credits. |
56
+ | query | `setLang` | string | no | — | examples: `en`, `es`, `fr`, `de` | Language code. |
57
+ | query | `cc` | string | no | — | examples: `US`, `GB`, `DE` | Country code. |
58
+ | query | `geolocation` | string | no | — | `random` documented | Geographic location. |
59
+ | query | `device` | string | no | `desktop` | `desktop`, `mobile`, `tablet` | Device simulation. |
60
+ | query | `copilot_answer` | boolean | no | `true` | — | Include Copilot answers. |
61
+ | query | `questions_answers` | boolean | no | `true` | — | Include People Also Ask. |
62
+ | query | `related_queries` | boolean | no | `true` | — | Include related searches. |
63
+ | query | `sidebar` | boolean | no | `true` | — | Include sidebar data. |
64
+ | query | `direct_answer` | boolean | no | `true` | — | Include direct answers. |
65
+ | query | `raw_html` | boolean | no | `false` | — | Return raw HTML. |
66
+ | query | `enhanced_html` | boolean | no | `false` | — | Return cleaned HTML. |
67
+ | query | `page_text` | boolean | no | `false` | — | Return plain text. |
68
+ | query | `markdown` | boolean | no | `false` | — | Return Markdown. |
69
+ | query | `auto_crawling` | boolean | no | `false` | — | Crawl result URLs automatically. |
70
+ | query | `count` | integer | no | `not specified in Crawleo docs` | `not specified in Crawleo docs` | Appears in examples but not in visible parameter table. |
71
+
72
+ #### Examples
73
+
74
+ - `GET /search?query=machine%20learning&count=10`
75
+ - `GET /search?query=AI%20agents&auto_crawling=true&markdown=true`
76
+
77
+ #### Response Shape
78
+
79
+ Top-level fields include `query`, `pages_fetched`, `pages`, `total_results`, `search_results`, `related_queries`, and `credits`. Result/page fields include `title`, `link`, `date`, `snippet`, `source`, `page_content`, `enhanced_html`, and `page_markdown`.
80
+
81
+ #### Errors / Ambiguities
82
+
83
+ - Error response table: `not specified in Crawleo docs`.
84
+ - `count` appears in examples but not the visible parameter table.
85
+
86
+ ### `/google-search` — Google Search API
87
+
88
+ - Method: `GET`
89
+ - URL: `https://api.crawleo.dev/google-search`
90
+ - MCP tool: `google_search`
91
+ - Purpose: Real-time Google SERP data including web, news, images, places, shopping, knowledge graph, People Also Ask, related searches, and answer boxes.
92
+ - Sources:
93
+ - `.gsd/research/crawleo-docs/md/google-search.md` / `https://docs.crawleo.dev/api-reference/endpoint/google-search.md`
94
+ - `.gsd/research/crawleo-docs/md/overview.md` / `https://docs.crawleo.dev/mcp/overview.md`
95
+ - Cost: 10 credits per request.
96
+
97
+ #### Parameters
98
+
99
+ | Location | Name | Type | Required | Default | Limits / Enum | Notes |
100
+ |---|---|---:|---:|---|---|---|
101
+ | header | `x-api-key` | string | yes | — | — | Crawleo API key; Bearer auth is also documented. |
102
+ | query | `q` | string | yes | — | — | Search query. |
103
+ | query | `gl` | string | no | `us` | ISO 3166-1 alpha-2 examples: `us`, `gb`, `eg`, `de`, `fr` | Country. |
104
+ | query | `hl` | string | no | `en` | IETF language examples: `en`, `ar`, `fr`, `de` | Language. |
105
+ | query | `tbs` | string | no | — | `qdr:h`, `qdr:d`, `qdr:w`, `qdr:m`, `qdr:y` | Freshness filter. |
106
+ | query | `page` | integer | no | `1` | 1-indexed; upper bound `not specified in Crawleo docs` | Result page. |
107
+ | query | `num` | integer | no | `10` | `1–100` | Results per page. |
108
+ | query | `type` | string | no | `search` | `search`, `news`, `images`, `places`, `shopping` | Result vertical. |
109
+
110
+ #### Examples
111
+
112
+ - `GET /google-search?q=best%20CRM%20software&gl=us&hl=en&num=10`
113
+ - `GET /google-search?q=AI&type=news&tbs=qdr:d`
114
+ - `GET /google-search?q=coffee&type=places&gl=us`
115
+ - `GET /google-search?q=laptop&type=shopping`
116
+
117
+ #### Response Shape
118
+
119
+ Top-level fields include `parameters`, `google_search_results`, `knowledgeGraph`, `peopleAlsoAsk`, `relatedSearches`, and `answerBox`. Result fields include `title`, `link`, `snippet`, and `position`.
120
+
121
+ #### Errors / Ambiguities
122
+
123
+ | Status | Meaning |
124
+ |---:|---|
125
+ | 400 | Missing required parameter `q` |
126
+ | 401 | Invalid or missing API key |
127
+ | 402 | Insufficient credits |
128
+ | 429 | Rate limit exceeded |
129
+ | 500 | Internal server error |
130
+
131
+ - `/google-search` is absent from the local OpenAPI snapshot but present in endpoint-specific docs and docs index.
132
+
133
+ ### `/google-maps` — Google Maps API
134
+
135
+ - Method: `GET`
136
+ - URL: `https://api.crawleo.dev/google-maps`
137
+ - MCP tool: `google_maps`
138
+ - Purpose: Google Maps business/place/landmark search with structured place data.
139
+ - Sources:
140
+ - `.gsd/research/crawleo-docs/md/google-maps.md` / `https://docs.crawleo.dev/api-reference/endpoint/google-maps.md`
141
+ - `.gsd/research/crawleo-docs/md/overview.md` / `https://docs.crawleo.dev/mcp/overview.md`
142
+ - `.gsd/research/crawleo-docs/openapi.json.json` / `https://docs.crawleo.dev/openapi.json`
143
+ - Cost: endpoint doc says 30 credits per request; MCP overview says 10 credits per request.
144
+
145
+ #### Parameters
146
+
147
+ | Location | Name | Type | Required | Default | Limits / Enum | Notes |
148
+ |---|---|---:|---:|---|---|---|
149
+ | header | `x-api-key` | string | yes | — | — | Crawleo API key; Bearer auth is also documented. |
150
+ | query | `q` | string | yes | — | — | Business name, landmark, address, keyword, or category + location query. |
151
+ | query | `hl` | string | no | `not specified in Crawleo docs` | ISO 639-1 examples: `en`, `ar`, `fr`, `de` | Language code. |
152
+ | query | `ll` | string | no | — | `@latitude,longitude,zoomz`, zoom `1z–21z` | Location bias. |
153
+ | query | `placeId` | string | no | — | — | Google Place ID lookup. |
154
+ | query | `cid` | string | no | — | — | Google numeric business/customer ID lookup. |
155
+
156
+ Documented combinations: `q`, `q + hl`, `q + ll`, `q + ll + hl`, `q + placeId`, `q + placeId + hl`, `q + cid`, `q + cid + hl`.
157
+
158
+ #### Examples
159
+
160
+ - `GET /google-maps?q=restaurants%20in%20Paris&hl=fr`
161
+ - `GET /google-maps?q=coffee%20shops&ll=%4048.8566%2C2.3522%2C15z&hl=fr`
162
+ - `GET /google-maps?q=Le%20Comptoir&placeId=ChIJLU7jZClu5kcR4PcOOO6p3I0`
163
+
164
+ #### Response Shape
165
+
166
+ Top-level fields include `parameters`, `google_maps_results`, and `credits`. Place result fields include `position`, `title`, `address`, `rating`, `ratingCount`, `phoneNumber`, `website`, `type`, `types`, `priceLevel`, `placeId`, `cid`, `latitude`, `longitude`, `openingHours`, and `thumbnailUrl`.
167
+
168
+ #### Errors / Ambiguities
169
+
170
+ | Status | Meaning |
171
+ |---:|---|
172
+ | 400 | Missing required query parameter `q` |
173
+ | 401 | Invalid or missing API key |
174
+ | 403 | Inactive account or expired subscription |
175
+ | 429 | Credits exhausted or concurrent request limit reached |
176
+ | 500 | Internal server error |
177
+
178
+ - Cost conflict: endpoint doc says 30 credits per request; MCP overview says 10 credits per request.
179
+ - Default for `hl` is `not specified in Crawleo docs`.
180
+
181
+ ### `/crawl` — Crawler API
182
+
183
+ - Method: `GET`
184
+ - URL: `https://api.crawleo.dev/crawl`
185
+ - MCP tool: `crawl_web`
186
+ - Purpose: Direct URL crawling with optional JavaScript rendering, extraction, screenshots, and multiple output formats.
187
+ - Sources:
188
+ - `.gsd/research/crawleo-docs/md/crawler.md` / `https://docs.crawleo.dev/api-reference/endpoint/crawler.md`
189
+ - `.gsd/research/crawleo-docs/md/overview.md` / `https://docs.crawleo.dev/mcp/overview.md`
190
+ - `.gsd/research/crawleo-docs/openapi.json.json` / `https://docs.crawleo.dev/openapi.json`
191
+ - Cost: 1 credit per URL when `render_js=false`; 10 credits per URL when `render_js=true`.
192
+
193
+ #### Parameters
194
+
195
+ | Location | Name | Type | Required | Default | Limits / Enum | Notes |
196
+ |---|---|---:|---:|---|---|---|
197
+ | header | `x-api-key` | string | yes | — | — | Crawleo API key; Bearer auth is also documented. |
198
+ | query | `urls` | string | yes | — | single URL or comma-separated URLs | URL(s) to crawl. |
199
+ | query | `render_js` | boolean | no | `false` | — | Browser rendering; increases cost to 10 credits per URL. |
200
+ | query | `geolocation` | string | no | — | ISO 3166-1 alpha-2 examples: `us`, `gb`, `de` | Geolocation country. |
201
+ | query | `raw_html` | boolean | no | `false` | — | Return raw HTML. |
202
+ | query | `enhanced_html` | boolean | no | `true` | — | Return cleaned HTML. |
203
+ | query | `page_text` | boolean | no | `false` | — | Return plain text. |
204
+ | query | `markdown` | boolean | no | `true` | — | Return Markdown. |
205
+ | query | `screenshot` | boolean | no | `false` | Only available when `render_js=true` | Capture screenshot. |
206
+ | query | `screenshot_full_page` | boolean | no | `false` | Requires screenshot flow | Capture full page. |
207
+
208
+ #### Examples
209
+
210
+ - `GET /crawl?urls=https://example.com&markdown=true`
211
+ - `GET /crawl?urls=https://example.com&render_js=true&screenshot=true`
212
+
213
+ #### Response Shape
214
+
215
+ Top-level fields include `results`, `credits`, and `successful_pages`. Per-result fields include `url`, `status_code`, `raw_html`, `enhanced_html`, `markdown`, `page_text`, `screenshot`, and `error`.
216
+
217
+ #### Errors / Ambiguities
218
+
219
+ - Error response table: `not specified in Crawleo docs`.
220
+
221
+ ### `/headful-browser` — Headful Browser API
222
+
223
+ - Method: `GET`
224
+ - URL: `https://api.crawleo.dev/headful-browser`
225
+ - MCP tool: `headful_browser`
226
+ - Purpose: Premium headed browser crawling with anti-bot evasion, SOAX residential proxies, screenshots, and multiple output formats.
227
+ - Sources:
228
+ - `.gsd/research/crawleo-docs/md/headful-browser.md` / `https://docs.crawleo.dev/api-reference/endpoint/headful-browser.md`
229
+ - `.gsd/research/crawleo-docs/md/overview.md` / `https://docs.crawleo.dev/mcp/overview.md`
230
+ - Cost: 50 credits per URL; failed requests cost 0 credits.
231
+
232
+ #### Parameters
233
+
234
+ | Location | Name | Type | Required | Default | Limits / Enum | Notes |
235
+ |---|---|---:|---:|---|---|---|
236
+ | header | `x-api-key` | string | yes | — | — | Crawleo API key; Bearer auth is also documented. |
237
+ | query | `urls` | string | yes | — | single URL or comma-separated URLs | URL(s) to crawl. |
238
+ | query | `country` | string | no | `us` | examples: `us`, `gb`, `de`, `fr`, `jp`, `in`, `br`, `ca`, `au`, and more | Residential proxy country. |
239
+ | query | `output_format` | string | no | `markdown` | `markdown`, `enhanced_html`, `raw_html`, `page_text` | Output format. |
240
+ | query | `screenshot` | boolean | no | `false` | — | Return screenshot URL. |
241
+
242
+ #### Examples
243
+
244
+ - `GET /headful-browser?urls=https://example.com&output_format=markdown`
245
+ - `GET /headful-browser?urls=https://example.com&screenshot=true`
246
+
247
+ #### Response Shape
248
+
249
+ Top-level fields include `status`, `data`, `credits_used`, and `credits_remaining`. Per-item fields include `url`, `markdown`, `raw_html`, `enhanced_html`, `page_text`, `screenshot`, and `blocked`.
250
+
251
+ #### Errors / Ambiguities
252
+
253
+ - `/headful-browser` is absent from the local OpenAPI snapshot but present in endpoint-specific docs and docs index.
254
+ - Error response table: `not specified in Crawleo docs`.
255
+
256
+ ## Verification
257
+
258
+ Structured JSON should parse with:
259
+
260
+ ```bash
261
+ node -e "JSON.parse(require('fs').readFileSync('contracts/crawleo-endpoints.json','utf8')); console.log('valid json')"
262
+ ```
263
+
264
+ Full S01 contract verification will be added in `scripts/verify-contracts.js` and run with:
265
+
266
+ ```bash
267
+ node scripts/verify-contracts.js
268
+ ```
@@ -0,0 +1,84 @@
1
+ # Crawleo OpenClaw Skill Final Assembly Report
2
+
3
+ This report summarizes the final package assembly state for the Crawleo OpenClaw skill milestone.
4
+
5
+ ## Package Contents
6
+
7
+ The package includes:
8
+
9
+ - Package metadata and scripts in `package.json`.
10
+ - OpenClaw-facing metadata in `skill.json`.
11
+ - OpenClaw-facing instructions in `SKILL.md`.
12
+ - User-facing setup, usage, error, and verification docs in `README.md`.
13
+ - Crawleo endpoint contracts in `contracts/crawleo-endpoints.json` and `contracts/crawleo-endpoints.md`.
14
+ - Endpoint-to-wrapper/test/example coverage in `contracts/coverage-checklist.md`.
15
+ - REST wrapper implementation in `src/index.js`, `src/client.js`, `src/contract.js`, `src/endpoints.js`, and `src/errors.js`.
16
+ - Safe examples in `examples/offline-fake-fetch.js` and `examples/live-usage-template.js`.
17
+ - Offline and live-gated tests in `test/`.
18
+ - Verification scripts in `scripts/verify-contracts.js`, `scripts/verify-scaffold.js`, and `scripts/verify-final.js`.
19
+
20
+ ## Endpoint and Tool Coverage
21
+
22
+ | REST Endpoint | MCP Tool | Wrapper Method | Verification Surface |
23
+ |---|---|---|---|
24
+ | `/search` | `search_web` | `client.search` | Contract, README, examples, wrapper fixtures, error fixtures, final verifier |
25
+ | `/google-search` | `google_search` | `client.googleSearch` | Contract, README, examples, wrapper fixtures, final verifier |
26
+ | `/google-maps` | `google_maps` | `client.googleMaps` | Contract, README, examples, wrapper fixtures, final verifier |
27
+ | `/crawl` | `crawl_web` | `client.crawl` | Contract, README, examples, wrapper fixtures, final verifier |
28
+ | `/headful-browser` | `headful_browser` | `client.headfulBrowser` | Contract, README, examples, wrapper fixtures, final verifier |
29
+
30
+ Coverage is grounded in Crawleo endpoint-specific documentation. Where Crawleo sources are ambiguous or conflict, the contract preserves the ambiguity instead of inventing behavior; unresolved values use `not specified in Crawleo docs`.
31
+
32
+ ## Verification Commands
33
+
34
+ Default verification is offline and safe by default:
35
+
36
+ ```bash
37
+ npm test
38
+ npm run verify:contracts
39
+ npm run verify:examples
40
+ npm run verify:scaffold
41
+ npm run verify:final
42
+ ```
43
+
44
+ In this environment, the default npm cache path is on a full C: drive. Use `npm_config_cache=.npm-cache` before npm commands if npm reports `ENOSPC` while writing cache or logs.
45
+
46
+ Latest final verification evidence used:
47
+
48
+ ```bash
49
+ npm_config_cache=.npm-cache npm test \
50
+ && npm_config_cache=.npm-cache npm run test:live \
51
+ && npm_config_cache=.npm-cache npm run verify:contracts \
52
+ && npm_config_cache=.npm-cache npm run verify:examples \
53
+ && npm_config_cache=.npm-cache npm run verify:scaffold \
54
+ && npm_config_cache=.npm-cache npm run verify:final
55
+ ```
56
+
57
+ Result: 35 passing tests, 1 skipped live test, explicit `test:live` skipped safely, contract verification passed, examples verification passed with live skip, scaffold verification passed, and final assembly verification passed.
58
+
59
+ ## Live-Test Gate Status
60
+
61
+ Live Crawleo calls are not part of default verification.
62
+
63
+ Optional live smoke tests require both:
64
+
65
+ 1. `CRAWLEO_API_KEY`
66
+ 2. `CRAWLEO_ENABLE_LIVE_TESTS=1`
67
+
68
+ Run optional live verification with:
69
+
70
+ ```bash
71
+ CRAWLEO_API_KEY=... CRAWLEO_ENABLE_LIVE_TESTS=1 npm run test:live
72
+ ```
73
+
74
+ Without both variables, `npm run test:live` exits successfully with the live smoke test skipped. The live usage example uses a separate explicit gate, `CRAWLEO_ENABLE_LIVE_EXAMPLE=1`, and also skips safely without credentials.
75
+
76
+ ## Known Limitations
77
+
78
+ - No live Crawleo API call was executed during default milestone verification because credentials and explicit live enablement were not provided.
79
+ - Crawleo source ambiguity is intentionally preserved, including `/search` example-only `count`, Google Maps cost conflict, and OpenAPI omissions for `/google-search` and `/headful-browser`.
80
+ - Final verification is file/content based and offline; it proves package assembly and wrapper behavior through injected-fetch tests rather than live Crawleo availability.
81
+
82
+ ## Final Assembly Verdict
83
+
84
+ The package is assembled as a Crawleo-branded OpenClaw skill with complete documented endpoint coverage, offline-safe REST wrappers, safe examples, stable error diagnostics, live-test gating, and reproducible offline verification.
@@ -0,0 +1,37 @@
1
+ # Crawleo OpenClaw Skill Examples
2
+
3
+ These examples show how to use the Crawleo wrapper API safely.
4
+
5
+ ## Offline fake-fetch example
6
+
7
+ ```bash
8
+ node examples/offline-fake-fetch.js
9
+ ```
10
+
11
+ This example injects a fake `fetch` implementation and calls every wrapper method without network access, `CRAWLEO_API_KEY`, or Crawleo credit usage.
12
+
13
+ Covered methods:
14
+
15
+ - `client.search`
16
+ - `client.googleSearch`
17
+ - `client.googleMaps`
18
+ - `client.crawl`
19
+ - `client.headfulBrowser`
20
+
21
+ ## Live usage template
22
+
23
+ ```bash
24
+ CRAWLEO_API_KEY=... CRAWLEO_ENABLE_LIVE_EXAMPLE=1 node examples/live-usage-template.js
25
+ ```
26
+
27
+ The live template exits successfully without making a request unless both `CRAWLEO_API_KEY` and `CRAWLEO_ENABLE_LIVE_EXAMPLE=1` are present. Never print or commit API key values.
28
+
29
+ Default verification should use the offline example only or rely on the template's safe skip behavior.
30
+
31
+ Optional live tests use the same two-part gate:
32
+
33
+ ```bash
34
+ CRAWLEO_API_KEY=... CRAWLEO_ENABLE_LIVE_TESTS=1 npm run test:live
35
+ ```
36
+
37
+ Without both variables, the live test file skips safely and exits 0.