Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use DeepAPI for supported scraping, research, and email workflows with explicit credentials and approval.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 1062% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 577% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 569% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 253% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 172% | 0% |
Use this skill when the user asks you to scrape public web data or draft/read/send email through DeepAPI.
version value in the frontmatter above.skillVersion, report the mismatch andstop. Do not fetch, overwrite, or otherwise self-update this SKILL.md.
approval for any package or repository update.
DEEPAPI_API_BASE_URL from the environment.DEEPAPI_API_KEY from the environment.DEEPAPI_API_KEY.Authorization: Bearer $DEEPAPI_API_KEY on every request.Content-Type: application/json when sending JSON.Idempotency-Key for every POST.maxCostUsd or maxCostMicrousd.send: false or mode: draft unless the user explicitly approves sending.emailIdentityId or omit it.status: running, wait next.afterSecs and call next.method + next.path until status is succeeded or failed.error.retryable is true, wait error.retryAfterSecs before retrying.error.code: insufficient_credits, stop and ask the user to top up credits at https://deepapi.co/credits. After top-up, retry with the same Idempotency-Key.requestId, status, debitMicrousd, costFinal, and the useful part of output.| Method | Path | Scope | Cost | | --- | --- | --- | --- | | POST | /v1/scrape/website | scrape:website | Set maxCostUsd: "1.00" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/linkedin/profile | scrape:linkedin | Set maxCostUsd: "0.05" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/github/profile | scrape:github | Set maxCostUsd: "0.03" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/twitter/search | scrape:twitter | Set maxCostUsd: "0.03" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/linkedin/jobs | scrape:linkedin | Set maxCostUsd: "0.05" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/linkedin/company | scrape:linkedin | Set maxCostUsd: "0.05" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/linkedin/people | scrape:linkedin | Set maxCostUsd: "0.50" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/linkedin/posts | scrape:linkedin | Set maxCostUsd: "0.05" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/twitter/user | scrape:twitter | Set maxCostUsd: "0.05" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/twitter/replies | scrape:twitter | Set maxCostUsd: "0.20" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/youtube/transcript | scrape:youtube | Set maxCostUsd: "0.05" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/youtube/channel | scrape:youtube | Set maxCostUsd: "0.30" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/youtube/search | scrape:youtube | Set maxCostUsd: "0.10" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/linkedin | scrape:linkedin | Set maxCostUsd: "0.05" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/github | scrape:github | Set maxCostUsd: "0.03" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/scrape/twitter | scrape:twitter | Set maxCostUsd: "0.03" unless the user gives a different cap. The route requires maxCostUsd or maxCostMicrousd as the customer spend cap. The final debit is capped by that amount and reported as debitMicrousd. | | POST | /v1/email/send | email:send | Uses configured email unit pricing; the route does not accept maxCostUsd. Check debitMicrousd in the response. | | GET | /v1/email/messages | email:read | Read route returns debitMicrousd 0. | | GET | /v1/email/drafts | email:read | Read route returns debitMicrousd 0. | | POST | /v1/email/drafts/{draftId}/send | email:send | Uses configured email unit pricing; the route does not accept maxCostUsd. Check debitMicrousd in the response. | | POST | /v1/research/deep | research:deep | Set maxCostUsd: "0.10" unless the user gives a different cap. Defaults to maxCostUsd 0.10. Pass maxCostUsd or maxCostMicrousd to choose a different customer spend cap. The final debit is capped and reported as debitMicrousd. | | POST | /v1/generate/image | generate:image | Set maxCostUsd: "0.20" unless the user gives a different cap. Defaults to maxCostUsd 0.20. Pass maxCostUsd or maxCostMicrousd to choose a different customer spend cap. The final debit is capped and reported as debitMicrousd. | | POST | /v1/search/web | search:web | Set maxCostUsd: "0.05" unless the user gives a different cap. Defaults to maxCostUsd 0.05. Pass maxCostUsd or maxCostMicrousd to choose a different customer spend cap. The final debit is capped and reported as debitMicrousd. | | GET | /v1/requests/{requestId} | same key | Status polling does not create a new debit. |
Use POST /v1/scrape/website. Crawl website pages and return clean text and markdown per page.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "1.00", "waitForFinishSecs": 60, "urls": [ "https://example.com" ], "maxPages": 1 }
Use POST /v1/scrape/linkedin/profile. Scrape public LinkedIn profile details.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.05", "waitForFinishSecs": 60, "profiles": [ "williamhgates" ] }
Use POST /v1/scrape/github/profile. Scrape public GitHub profile details.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.03", "waitForFinishSecs": 60, "usernames": [ "octocat" ] }
Use POST /v1/scrape/twitter/search. Scrape X/Twitter posts from a search query or account handles.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.03", "waitForFinishSecs": 60, "handles": [ "nasa" ], "maxItems": 1, "sort": "latest" }
Use POST /v1/scrape/linkedin/jobs. Scrape public LinkedIn job listings for a search query.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.05", "waitForFinishSecs": 60, "query": "software engineer", "location": "United States", "maxItems": 5 }
Use POST /v1/scrape/linkedin/company. Scrape public LinkedIn company pages for firmographic details.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.05", "waitForFinishSecs": 60, "companies": [ "microsoft" ] }
Use POST /v1/scrape/linkedin/people. Search public LinkedIn profiles by role, location, company, or school. Requires maxCostUsd of at least 0.50.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.50", "waitForFinishSecs": 60, "titles": [ "Founder" ], "locations": [ "San Francisco" ], "maxItems": 5 }
Use POST /v1/scrape/linkedin/posts. Scrape recent public posts from LinkedIn profiles or company pages.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.05", "waitForFinishSecs": 60, "profiles": [ "williamhgates" ], "maxItems": 3 }
Use POST /v1/scrape/twitter/user. Scrape public X/Twitter account profiles, with optional follower and following lists.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.05", "waitForFinishSecs": 60, "handles": [ "nasa" ] }
Use POST /v1/scrape/twitter/replies. Scrape the public reply thread of an X/Twitter post. Requires maxCostUsd of at least 0.20.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.20", "waitForFinishSecs": 60, "url": "https://x.com/NASA/status/1234567890123456789", "maxItems": 5 }
Use POST /v1/scrape/youtube/transcript. Scrape the transcript of a YouTube video as plain text plus timed segments. Videos without captions return an empty result.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.05", "waitForFinishSecs": 60, "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }
Use POST /v1/scrape/youtube/channel. Scrape a YouTube channel's stats and recent videos. Each video item includes subscriber and channel totals.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.30", "waitForFinishSecs": 60, "channels": [ "mkbhd" ], "maxItems": 3 }
Use POST /v1/scrape/youtube/search. Search YouTube videos by keyword and return video metadata.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.10", "waitForFinishSecs": 60, "query": "ai agents", "sort": "views", "maxItems": 3 }
Use POST /v1/scrape/linkedin. Backward-compatible alias for LinkedIn profile scraping.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.05", "waitForFinishSecs": 60, "profiles": [ "williamhgates" ] }
Use POST /v1/scrape/github. Backward-compatible alias for GitHub profile scraping.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.03", "waitForFinishSecs": 60, "usernames": [ "octocat" ] }
Use POST /v1/scrape/twitter. Backward-compatible alias for X/Twitter search scraping.
Side effects: Starts a scrape run and may debit credits when the run finishes. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example body:
json{ "maxCostUsd": "0.03", "waitForFinishSecs": 60, "handles": [ "nasa" ], "maxItems": 1, "sort": "latest" }
Use POST /v1/email/send. Create an email draft from a workspace email identity; set send=true to send it.
Side effects: Creates a draft, or sends an email when direct send is approved. Polling: This route returns a terminal envelope directly.
Safety:
Example body:
json{ "to": "<email-address>", "subject": "Quick hello", "text": "Hi, this is a draft from my agent.", "send": false }
Use GET /v1/email/messages. Read messages for a workspace email identity.
Side effects: Reads messages only. Polling: This route returns a terminal envelope directly.
Safety:
Use GET /v1/email/drafts. List pending email drafts for a workspace email identity.
Side effects: Reads drafts only. Polling: This route returns a terminal envelope directly.
Safety:
Use POST /v1/email/drafts/{draftId}/send. Approve and send an existing draft by draftId after review.
Side effects: Sends the reviewed draft as a real email when direct send is approved. Polling: This route returns a terminal envelope directly.
Safety:
Example body:
json{}
Use POST /v1/research/deep. Answer a research question with current web evidence.
Side effects: Runs a paid web research request and debits credits when finished. Polling: This route returns a terminal envelope directly.
Safety:
Example body:
json{ "query": "What changed in EU AI Act compliance timelines for API startups?", "context": "We sell API tooling to EU customers.", "maxCostUsd": "0.10" }
Use POST /v1/generate/image. Generate an image from a text prompt.
Side effects: Runs a paid image generation request and debits credits when finished. Polling: This route returns a terminal envelope directly.
Safety:
Example body:
json{ "prompt": "A minimal flat illustration of a rocket launching from a laptop screen", "maxCostUsd": "0.20" }
Use POST /v1/search/web. Search the web and return ranked results with title, url, and snippet.
Side effects: Runs a paid web search request and debits credits when finished. Polling: This route returns a terminal envelope directly.
Safety:
Example body:
json{ "query": "latest stable Node.js LTS version", "maxResults": 3, "maxCostUsd": "0.05" }
Use GET /v1/requests/{requestId}. Poll a running request by requestId.
Side effects: Reads or refreshes request status. Polling: If status is running, wait next.afterSecs and call next.method next.path until status is succeeded or failed.
Safety:
Example query: waitForFinishSecs=60
davidondrej/skills; verify local paths, tools, credentials, and agent features before acting.Other measured skills in the registry, with their headline benchmark lift.