{"openapi":"3.1.0","info":{"title":"ActionDock API","version":"0.1.0","description":"A job-based execution API for AI agents. Read /v1/manifest for the live action catalog."},"servers":[{"url":"https://actiondock.app"}],"security":[{"bearerAuth":[]}],"paths":{"/health":{"get":{"summary":"Service health","security":[],"responses":{"200":{"description":"Healthy"}}}},"/ready":{"get":{"summary":"Validate production provider configuration","responses":{"200":{"description":"Runtime is ready"},"503":{"description":"One or more live integrations are incomplete"}}}},"/v1/manifest":{"get":{"summary":"Machine-readable agent manifest and action catalog","security":[],"responses":{"200":{"description":"Agent manifest"}}}},"/skill.md":{"get":{"summary":"Portable Agent Skill for recommendation and execution","security":[],"responses":{"200":{"description":"ActionDock SKILL.md"}}}},"/v1/actions":{"get":{"summary":"List actions","responses":{"200":{"description":"Action catalog"}}}},"/v1/signup":{"post":{"summary":"Create a workspace checkout and one-time API-key claim","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email","plan","cycle","termsAccepted","legalVersion"],"properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"plan":{"type":"string","enum":["launch","growth","scale"]},"cycle":{"type":"string","enum":["monthly","annual"]},"termsAccepted":{"type":"boolean","const":true},"legalVersion":{"type":"string","const":"2026-07-24"}}}}}},"responses":{"201":{"description":"Checkout created"}}}},"/v1/actions/{action}":{"post":{"summary":"Submit an action","parameters":[{"name":"action","in":"path","required":true,"schema":{"type":"string","enum":["sales.funnel.recommend","text.generate","research.web","image.generate","video.generate","voice.generate","email.send","call.start","call.transfer","call.hangup"]}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"object"},"approve":{"type":"boolean"},"idempotencyKey":{"type":"string"}},"required":["input"]}}}},"responses":{"202":{"description":"Job accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}}}}},"/v1/jobs/{jobId}":{"get":{"summary":"Get a job","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}}}}},"/v1/jobs/{jobId}/approve":{"post":{"summary":"Approve a waiting side effect","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"202":{"description":"Approval accepted"}}}},"/v1/events":{"get":{"summary":"List inbound and provider events","responses":{"200":{"description":"Event list"}}}},"/v1/usage":{"get":{"summary":"List metered usage and the current UTC-month total","responses":{"200":{"description":"Usage summary and records"}}}},"/v1/billing":{"get":{"summary":"Get plan, subscription, reserved funds, and execution balance","responses":{"200":{"description":"Workspace billing snapshot"}}}},"/v1/artifacts":{"get":{"summary":"List tenant artifacts and storage usage","responses":{"200":{"description":"Artifacts and storage usage"}}}},"/v1/billing/topups/{amount}":{"post":{"summary":"Create a Lemon Squeezy balance top-up checkout","parameters":[{"name":"amount","in":"path","required":true,"schema":{"type":"string","enum":["25","100","500"]}}],"responses":{"201":{"description":"Top-up checkout created"}}}},"/v1/billing/portal":{"get":{"summary":"Get a fresh Lemon Squeezy customer portal URL","responses":{"200":{"description":"Customer portal URL"}}}},"/v1/suppressions":{"post":{"summary":"Add an email address to the tenant suppression list","responses":{"201":{"description":"Recipient suppressed"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"Job":{"type":"object","required":["id","action","status","input","sideEffect"],"properties":{"id":{"type":"string","format":"uuid"},"action":{"type":"string"},"status":{"type":"string","enum":["queued","running","awaiting_approval","succeeded","failed"]},"input":{},"output":{},"error":{"type":["string","null"]},"sideEffect":{"type":"boolean"}}}}},"x-actiondock-actions":[{"name":"sales.funnel.recommend","description":"Recommend an executable sales funnel for the current goal and return stages mapped to service capabilities.","sideEffect":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"goal":{"type":"string","enum":["validate-pivot","book-demos","qualify-inbound","build-enterprise-pipeline","reactivate-leads"]},"companyStage":{"default":"early","type":"string","enum":["idea","early","growth","enterprise"]},"motion":{"default":"outbound","type":"string","enum":["outbound","inbound","mixed"]},"dealSize":{"default":"medium","type":"string","enum":["low","medium","high"]},"hasExistingLeads":{"default":false,"type":"boolean"},"notes":{"type":"string","minLength":1,"maxLength":5000}},"required":["goal","companyStage","motion","dealSize","hasExistingLeads"],"additionalProperties":false}},{"name":"text.generate","description":"Generate copy, summaries, scripts, outreach messages, or other text.","sideEffect":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":100000},"instructions":{"type":"string","minLength":1,"maxLength":20000}},"required":["prompt"],"additionalProperties":false}},{"name":"research.web","description":"Research a topic on the public web and return a synthesized report.","sideEffect":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":20000},"instructions":{"type":"string","minLength":1,"maxLength":20000}},"required":["query"],"additionalProperties":false}},{"name":"image.generate","description":"Generate an image and return a durable artifact URL.","sideEffect":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":32000},"size":{"type":"string","enum":["auto","1024x1024","1536x1024","1024x1536"]},"quality":{"type":"string","enum":["auto","low","medium"]}},"required":["prompt"],"additionalProperties":false}},{"name":"video.generate","description":"Generate a short video with native audio and return a durable MP4 artifact URL.","sideEffect":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"prompt":{"type":"string","minLength":1,"maxLength":32000},"aspectRatio":{"type":"string","enum":["16:9","9:16"]}},"required":["prompt"],"additionalProperties":false}},{"name":"voice.generate","description":"Generate human-like spoken audio from text and return a WAV artifact.","sideEffect":false,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":20000},"voice":{"type":"string","minLength":1,"maxLength":100},"instructions":{"type":"string","minLength":1,"maxLength":5000}},"required":["text"],"additionalProperties":false}},{"name":"email.send","description":"Send a plain-text or HTML email through the configured mailbox.","sideEffect":true,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"to":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"subject":{"type":"string","minLength":1,"maxLength":998},"text":{"type":"string","minLength":1,"maxLength":200000},"html":{"type":"string","minLength":1,"maxLength":500000},"replyTo":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"category":{"type":"string","enum":["transactional","relationship","outreach"]},"consentBasis":{"type":"string","minLength":3,"maxLength":500}},"required":["to","subject","text","category","consentBasis"],"additionalProperties":false}},{"name":"call.start","description":"Start an outbound phone call and bridge it to the configured realtime voice agent.","sideEffect":true,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"to":{"type":"string","pattern":"^\\+[1-9]\\d{7,14}$"},"instructions":{"type":"string","minLength":10,"maxLength":20000},"voice":{"type":"string","minLength":1,"maxLength":100},"consentBasis":{"type":"string","minLength":3,"maxLength":500},"discloseAi":{"default":true,"type":"boolean","const":true}},"required":["to","instructions","consentBasis","discloseAi"],"additionalProperties":false}},{"name":"call.transfer","description":"Transfer an active call to a person or SIP endpoint.","sideEffect":true,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"callId":{"type":"string","minLength":1,"maxLength":200},"target":{"type":"string","pattern":"^(tel:\\+[1-9]\\d{7,14}|sip:[^\\s]+)$"}},"required":["callId","target"],"additionalProperties":false}},{"name":"call.hangup","description":"End an active Realtime call.","sideEffect":true,"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"callId":{"type":"string","minLength":1,"maxLength":200}},"required":["callId"],"additionalProperties":false}}],"x-actiondock-sales-funnels":[{"id":"pivot-validation","name":"Pivot validation loop","recommendedFor":"Pre-PMF founders who need evidence from real buyer conversations before building more product.","description":"A short founder-led loop optimized for learning quality and completed conversations instead of lead volume.","methodologies":["Problem interview","SPICED-style discovery"],"stages":[{"id":"find","name":"Find pain signals","objective":"Build a small list of people whose public context suggests the problem is real now.","capabilities":["research.web"],"exitCriteria":["Each prospect matches the hypothesis and has a verifiable pain signal.","The reason to contact each prospect is recorded."]},{"id":"reach","name":"Send a problem-first message","objective":"Ask for a short learning conversation without pretending the product is already proven.","capabilities":["text.generate","email.send"],"exitCriteria":["The message references a verified signal and one concrete problem.","The message has one low-friction call to action."]},{"id":"book","name":"Coordinate the conversation","objective":"Turn a positive reply into an agreed date and time.","capabilities":["email.send","list_events"],"exitCriteria":["A date and time were confirmed or a new time was requested."]},{"id":"demo","name":"Run the learning demo","objective":"Show only enough to test the hypothesis, then explore the current workflow and impact.","capabilities":["image.generate","video.generate","voice.generate","call.start","call.transfer"],"exitCriteria":["Current workaround, impact, urgency, and next step are captured.","The prospect was not pushed into a sale when the problem was absent."]},{"id":"learn","name":"Update the hypothesis","objective":"Synthesize replies and transcripts into repeated pains, objections, and a continue-or-pivot decision.","capabilities":["list_events","text.generate"],"exitCriteria":["Evidence is separated from assumptions.","The next outreach cohort or product change is explicit."]}],"metrics":["qualified prospects","positive reply rate","conversations completed","repeated pain rate","agreed next-step rate"],"guardrails":["Optimize for evidence, not bulk outreach.","Do not invent personalization or customer facts.","Honor opt-outs and stop contacting a prospect after a clear no."],"references":[{"title":"Winning by Design SPICED framework","url":"https://winningbydesign.com/spiced-framework/"}]},{"id":"founder-led-outbound","name":"Founder-led outbound","recommendedFor":"Early and growth-stage B2B teams with a defined ICP that want to book qualified demos.","description":"A focused outbound motion that combines account research, personalized email, lightweight qualification, and a clear demo handoff.","methodologies":["Problem-first outreach","SPICED-style qualification"],"stages":[{"id":"target","name":"Define a narrow cohort","objective":"Choose one ICP, trigger, and use case for the current campaign.","capabilities":["research.web","text.generate"],"exitCriteria":["Every account fits the same testable campaign hypothesis."]},{"id":"research","name":"Research account relevance","objective":"Find a current trigger and the likely owner of the problem.","capabilities":["research.web"],"exitCriteria":["Account relevance and contact relevance are both evidenced."]},{"id":"outreach","name":"Send personalized outreach","objective":"Connect the verified trigger to one useful outcome and one ask.","capabilities":["text.generate","email.send","voice.generate"],"exitCriteria":["Delivery and response status are observable."]},{"id":"qualify","name":"Qualify the problem","objective":"Confirm pain, impact, owner, urgency, and willingness to change.","capabilities":["call.start","call.transfer","list_events"],"exitCriteria":["A reason to advance or disqualify is recorded."]},{"id":"book-demo","name":"Coordinate and run the demo","objective":"Agree on a concrete next step and tailor the demo to discovered pain.","capabilities":["email.send","image.generate","video.generate","call.start"],"exitCriteria":["The buyer agrees to a dated next step or the opportunity is closed."]}],"metrics":["delivery rate","positive reply rate","qualified meeting rate","show rate","next-step rate"],"guardrails":["Prefer a small researched cohort over a scraped mass list.","Do not send more than two unanswered touches without a new reason to contact.","Disqualify quickly when the problem or ownership is absent."],"references":[{"title":"Winning by Design SPICED framework","url":"https://winningbydesign.com/spiced-framework/"}]},{"id":"inbound-speed-to-lead","name":"Inbound speed-to-lead","recommendedFor":"Teams receiving inbound questions, demo requests, or replies that need fast qualification and booking.","description":"A response-first funnel that enriches the inbound lead, answers quickly, qualifies fit, and books the correct next step.","methodologies":["Lightweight BANT","SPICED-style discovery"],"stages":[{"id":"capture","name":"Capture the inbound signal","objective":"Read new inbound events and identify the request and sender.","capabilities":["list_events"],"exitCriteria":["The request, source, and response deadline are known."]},{"id":"enrich","name":"Enrich before replying","objective":"Understand the company, role, likely use case, and obvious fit risks.","capabilities":["research.web"],"exitCriteria":["The reply can reference relevant, verified context."]},{"id":"respond","name":"Respond with a useful next step","objective":"Answer the immediate question and ask only what is needed to route the lead.","capabilities":["text.generate","email.send"],"exitCriteria":["The lead received a relevant response and one clear next step."]},{"id":"qualify","name":"Qualify fit and timing","objective":"Confirm need, decision owner, practical budget range, and timeline without interrogating.","capabilities":["call.start","list_events"],"exitCriteria":["The lead is routed to demo, nurture, or disqualified with a reason."]},{"id":"book","name":"Book the right conversation","objective":"Confirm the participants and timing, then prepare a tailored agenda or demo asset.","capabilities":["email.send","text.generate","image.generate","video.generate"],"exitCriteria":["The event, attendees, agenda, and owner are confirmed."]}],"metrics":["first-response time","qualified lead rate","booking rate","show rate","time to next step"],"guardrails":["Answer the lead's question before asking for a meeting.","Use BANT as a routing aid, not a rigid interrogation script.","Do not infer budget or authority without evidence."],"references":[{"title":"Salesforce guide to BANT","url":"https://www.salesforce.com/blog/sales/what-is-bant-lead-generation/"},{"title":"Winning by Design SPICED framework","url":"https://winningbydesign.com/spiced-framework/"}]},{"id":"enterprise-account-based","name":"Enterprise account-based motion","recommendedFor":"Growth and enterprise teams selling high-value solutions through multiple stakeholders and a complex buying process.","description":"A deliberate account motion that maps stakeholders, qualifies deal risk, runs role-specific discovery, and advances mutual next steps.","methodologies":["MEDDPICC","Multi-threaded account discovery"],"stages":[{"id":"select-accounts","name":"Select target accounts","objective":"Prioritize accounts with measurable pain and plausible strategic fit.","capabilities":["research.web","text.generate"],"exitCriteria":["Each account has a documented fit and timing thesis."]},{"id":"map-stakeholders","name":"Map the buying group","objective":"Identify likely users, champion, economic buyer, and blockers.","capabilities":["research.web"],"exitCriteria":["Missing roles and unverified assumptions are explicit."]},{"id":"open-discovery","name":"Open role-specific discovery","objective":"Reach each relevant role with a message grounded in their likely impact.","capabilities":["text.generate","email.send","call.start"],"exitCriteria":["At least one credible problem owner engages or the account is paused."]},{"id":"qualify-deal","name":"Qualify with MEDDPICC","objective":"Capture metrics, economic buyer, decision criteria and process, paper process, pain, champion, and competition.","capabilities":["call.start","call.transfer","list_events","text.generate"],"exitCriteria":["Known gaps and the next action for every material qualification risk are recorded."]},{"id":"advance","name":"Advance a mutual next step","objective":"Coordinate the right participants and tailor proof to their decision criteria.","capabilities":["image.generate","video.generate","email.send"],"exitCriteria":["A dated buyer-owned next step exists or the deal is disqualified."]}],"metrics":["engaged stakeholders per account","qualification coverage","champion strength","stage conversion","days in stage"],"guardrails":["Do not recommend this funnel for an unvalidated low-value offer.","Treat unknown MEDDPICC fields as risks, not as positive assumptions.","Do not create fake urgency or bypass stated procurement rules."],"references":[{"title":"MEDDPICC methodology overview","url":"https://meddicc.com/meddpicc-sales-methodology-and-process"}]},{"id":"lead-reactivation","name":"Lead reactivation","recommendedFor":"Teams with dormant conversations, lost opportunities, or an existing audience and a genuinely new reason to reconnect.","description":"A low-volume reactivation funnel based on a changed trigger, improved offer, or newly relevant customer outcome.","methodologies":["Trigger-based reactivation"],"stages":[{"id":"segment","name":"Choose a relevant segment","objective":"Select dormant leads that share a reason the new message may matter.","capabilities":["list_events","text.generate"],"exitCriteria":["Every selected lead has a prior relationship and a segment reason."]},{"id":"verify-trigger","name":"Verify a new reason to contact","objective":"Find what changed for the lead, product, or market since the last conversation.","capabilities":["research.web"],"exitCriteria":["A factual and relevant change is recorded for each lead."]},{"id":"reconnect","name":"Reconnect without pretending continuity","objective":"Acknowledge the prior context, state what changed, and offer an easy next step.","capabilities":["text.generate","email.send","voice.generate"],"exitCriteria":["The message contains a real update and a clear opt-out."]},{"id":"book-or-close","name":"Book or close the loop","objective":"Coordinate with interested leads and stop outreach to everyone else.","capabilities":["email.send","call.start","list_events"],"exitCriteria":["Every contacted lead is booked, deferred, or closed with a reason."]}],"metrics":["reactivation reply rate","rebooked conversations","requalified opportunities","unsubscribe rate"],"guardrails":["Never contact a lead who previously opted out.","Do not reactivate without a genuine new reason.","One unanswered reactivation message is enough unless the lead engages."],"references":[]}]}