API reference
All routes below live under the JSON API unless noted. Use this page with the programmatic quickstart for copy-paste examples. Building an external LLM or automation agent? Read External agents guide (documentation URLs, sessions vs enrollments, what to call when).
https://drippulse.io/api/v1 (or your self-hosted origin + /api/v1)Health (unauthenticated):
GET /health and GET /api/v1/health
- Authentication
- JSON, errors, collections, idempotency
- Admin / session login
- Agents
- Agent examples
- Agent templates
- Webhooks (outbound)
- Webhook examples
- Projects
- Team members
- Workflows & enrollments
- Enrollment list, funnel & dashboard
POST …/test— fixture merge semantics- Email: test stubs vs live ESP
- Enrollment bulk —
422edge cases - Workflow examples
- Event bridge (form → your API → enroll)
- API keys
- API key examples
- Reports
- Reports & monitoring examples
- Account & billing (account)
- Analytics
- Monitoring
- Integration connections
- Integration examples
- External tool adapters
- Data sources & runs
- Billing (Stripe)
- Inbound webhooks & tracking
Authentication
Most /api/v1/* endpoints require a Bearer token:
Authorization: Bearer <api_key_or_jwt>
- Organization API key — create under Dashboard → API Keys after sign-in. Preferred for automation.
- Session JWT — returned from Google OAuth or admin login; same header format.
Org-scoped resources only return data for the organization attached to the key or session.
JSON, errors, collections & idempotency
Format
- Content-Type:
application/json; charset=utf-8for bodies. - Timestamps: ISO 8601 in JSON (UTC unless noted).
- Booleans / null: Native JSON types.
Errors
Typical error bodies include error (string) or errors / message (see endpoint). Always read the response body for validation detail.
| HTTP | Typical cause |
|---|---|
| 400 | Malformed JSON or missing required parameter. |
| 401 | Missing or invalid Authorization bearer. |
| 403 | Authenticated but not permitted for the resource. |
| 404 | Unknown id for this org. |
| 422 / 400 | Validation failed — often includes field messages for workflows or agents. |
| 429 | Rate limited — backoff; honor Retry-After when set. |
| 5xx | Transient server error — retry with backoff for safe operations. |
List / collection responses
Many index endpoints return a JSON object with a plural key (e.g. workflows: [...]) and total_count. Current workflow listing returns the full collection for the organization ordered by recency — plan pagination in your client if you expect very large graphs.
Idempotency (summary)
Agent endpoints accept idempotency_key in the JSON body for deduplication per agent. Workflow and webhook subscription creates are not automatically idempotent. Full matrix: Production: retries & idempotency.
Admin / session login
For trusted scripts only; never expose admin credentials in client-side code.
| Method | Path | Notes |
|---|---|---|
| POST | /api/v1/admin/login | JSON body: username, password → JWT + admin payload |
| POST | /api/v1/sessions/admin | Alias of admin login |
| POST | /api/v1/auth/login | Alias for programmatic clients |
| GET | /api/v1/admin/verify | Validate token |
Agents
| Method | Path | Description |
|---|---|---|
| GET | /agents | List agents |
| POST | /agents/spawn | Deploy from template or workflow |
| GET | /agents/:id | Show agent |
| PATCH | /agents/:id | Update (e.g. status, config) |
| DELETE | /agents/:id | Destroy agent |
| GET | /agents/:id/executions | Execution history |
| GET | /agents/:id/status | Status snapshot |
| GET | /agents/:id/logs | Logs |
| GET | /agents/:id/costs | Cost summary |
| GET | /agents/:id/metrics | Aggregated metrics |
| POST | /agents/:id/inference | Template agent — structured JSON / LLM |
| POST | /agents/:id/execute | Generic execute (policy-driven) |
| POST | /agents/:id/score_lead | Lead scorer step |
Agents — usage examples & errors
Purpose: Run org-scoped automation units (templates or workflow-bound) with observable executions.
Auth: Authorization: Bearer with org API key or session JWT.
POST /api/v1/agents/spawn — top-level fields or nested agent: { ... }. Required: name, type (template | workflow | code). Conditional ids:
| Field | Required when | Notes |
|---|---|---|
name | always | Unique per org (duplicate name rejected). |
type | always | template, workflow, or code. |
template_id | type=template | Must reference an existing template. |
workflow_id | type=workflow | Must belong to current org. |
code_id | type=code | Custom code agent reference. |
configuration | optional | Sanitized key-value map for runtime tuning. |
{
"name": "Inbound Lead Qualification",
"type": "template",
"template_id": 1,
"configuration": { "min_score_threshold": 0.72 }
}
Response 201 (shape):
{
"id": 42,
"name": "Inbound Lead Qualification",
"status": "active",
"template_id": 1
}
POST /api/v1/agents/:id/execute — include idempotency_key in JSON for safe retries:
{
"input": { "company": "Acme", "industry": "SaaS" },
"idempotency_key": "partner-evt-20260402-xyz"
}
Common errors:
| Status | Meaning |
|---|---|
| 401 | Missing or invalid Bearer token. |
| 403 | Authenticated but not allowed for this org or action. |
| 404 | Agent or template not found for this org. |
| 422 | Invalid body (validation); read JSON errors or message. |
| 5xx | Transient failure — retry with backoff; keep same idempotency_key for execute paths. |
Operational notes: Execution rows appear in GET /agents/:id/executions; first logs may lag a few seconds. Side effects depend on agent policy (LLM calls, integrations).
Agent templates
| Method | Path | Description |
|---|---|---|
| GET | /agent_templates | List |
| POST | /agent_templates | Create |
| GET | /agent_templates/:id | Show |
| PATCH | /agent_templates/:id | Update |
| DELETE | /agent_templates/:id | Destroy |
| PATCH | /agent_templates/:id/execution_policy | Update execution policy |
Webhooks (outbound catalog)
| Method | Path | Description |
|---|---|---|
| GET | /webhooks | List configured webhooks |
| GET | /webhooks/catalog | Available event types / schema |
| POST | /webhooks | Create |
| GET | /webhooks/:id | Show |
| PATCH | /webhooks/:id | Update |
| DELETE | /webhooks/:id | Destroy |
| POST | /webhooks/:id/test | Send test delivery |
| GET | /webhooks/:id/deliveries | Delivery history |
Outbound webhooks — create & deliveries
Purpose: Deliver org events to your HTTPS endpoint; each subscription has a secret for HMAC verification (see Production readiness).
Auth: Bearer required for management routes.
POST /api/v1/webhooks — required: url, event_type; optional: active (default true). Example:
{
"url": "https://hooks.example.com/drippulse",
"event_type": "workflow.failed",
"active": true
}
Response 201 includes id, secret (store safely), url, event_type. Event catalog: GET /api/v1/webhooks/catalog.
GET /api/v1/webhooks/:id/deliveries — audit recent delivery attempts (status codes, timestamps).
Common errors: 400 missing url or event_type; 401/403 auth; 404 unknown id.
Standard resources :projects — index, show, create, update, destroy.
GET/POST /projects GET/PATCH/DELETE /projects/:id
Team members
GET/POST /team_members GET/PATCH/DELETE /team_members/:id
Workflows & enrollments
| Method | Path | Description |
|---|---|---|
| GET | /workflows | List |
| POST | /workflows | Create |
| GET | /workflows/step_types | Step type catalog (self-describing builder) |
| GET | /workflows/:id | Show |
| PATCH | /workflows/:id | Update |
| DELETE | /workflows/:id | Destroy |
| POST | /workflows/:id/test | Dry-run / test execution |
| GET | /workflows/:workflow_id/enrollments | List enrollments (ops summary per row) |
| GET | /workflows/:workflow_id/enrollments/:id | Enrollment detail: action timeline, deliveries, nurture events |
| POST | /workflows/:workflow_id/enrollments/bulk | Bulk create enrollments |
| DELETE | /workflows/:workflow_id/enrollments/:id | Remove one enrollment (test cleanup / cancel run) |
Enrollment list, step funnel & dashboard parity
Purpose: Operate and observe live per-contact runs of a saved workflow. External agents should treat this as the primary visibility API; it mirrors the workflow Enrollments tab in the dashboard.
GET /api/v1/workflows/:workflow_id/enrollments returns:
enrollments— up to 500 rows (most recent first) for this workflow.total— full count of enrollment rows (may exceed 500).step_funnel— aggregate “where are contacts in the graph?” keyed by saved step indices (0-basedstep_indexmatches the workflowstepsarray).
Each element of enrollments[] includes the core enrollment fields (id, workflow_id, agent_id, lead_ref, current_step_index, status, next_run_at, timezone, timestamps) plus summary helpers:
contact_email,contact_name(from stored contact payload)steps_total,current_step_name,current_step_typeprogress_label— human-readable progress (e.g. step N of M, completed, failed)waiting_until— when set, the enrollment is scheduled and waiting (typically a wait step) until this timelast_error— surfaced from runtime state when present
step_funnel shape (illustrative):
{
"step_funnel": {
"steps": [
{
"step_index": 0,
"step_number": 1,
"name": "Start",
"type": "trigger",
"active_leads": 12,
"waiting_leads": 0,
"running_leads": 12
},
{
"step_index": 1,
"step_number": 2,
"name": "Wait 30m",
"type": "wait",
"active_leads": 4,
"waiting_leads": 3,
"running_leads": 1
}
],
"totals": {
"active": 14,
"completed": 40,
"failed": 1,
"cancelled": 0,
"total_enrollments": 55
}
}
}
For each step bucket, active_leads counts enrollments currently positioned on that step; waiting_leads is the subset whose next_run_at is in the future (paused for a wait or schedule); running_leads is active_leads - waiting_leads.
GET /api/v1/workflows/:workflow_id/enrollments/:id returns a single object with:
enrollment— same summary shape as list rowsaction_timeline— chronological side effects (email, webhook, CRM, etc.) from workflow action logsdeliveries— per-step idempotent send recordsnurture_events— opens, clicks, unsubscribes when tracked mail is usedruntime_state— merged runtime payload / debug state for that enrollment
Dashboard: Open a saved workflow → Enrollments tab. You can add enrollments via Add enrollments (single contact with optional JSON fields, bulk JSON array, or selecting CRM contacts / CRM leads), set timezone, and optionally bind a workflow agent — equivalent to POST .../enrollments/bulk including optional agent_id.
For how external agents should load documentation (skills URL), what “sessions” means on the customer boundary, and decision trees, see External agents guide.
Workflows — create, test, errors
Purpose: Define multi-step automation (trigger → logic → actions) scoped to your org and optional project.
Auth: Bearer token. Write access typically Admin/Editor per product rules.
POST /api/v1/workflows — send top-level fields or wrap in workflow: { ... }. Required: name. Common fields:
| Field | Type | Notes |
|---|---|---|
name | string | Required. |
description | string | Optional. |
status | string | e.g. draft, active — product-specific enum. |
steps | array | Each step: type, name, and step parameters. Canonical shape: all parameters under config (matches the dashboard). Top-level fields beside type/name/id/position are merged at runtime but are normalized into config on save. |
integrations | array | Integration references as stored on the model. |
version | integer | May be managed server-side when steps change. |
{
"name": "Inbound Lead Qualification",
"description": "Draft from API",
"status": "draft",
"steps": [
{ "type": "trigger", "name": "Start", "config": { "frequency": "hourly" } },
{ "type": "log", "name": "Done", "config": { "message": "ok", "level": "info" } }
],
"integrations": []
}
Step shape (email / wait): Put subject, body, to, integration_id, etc. under config — same as GET /workflows/step_types field names. Example wait step: { "type": "wait", "name": "Pause", "config": { "duration": 1, "unit": "hours" } }. Sending those keys at the step top level still works for execution/tests, but the API persists them inside config so the visual editor and GET responses stay aligned.
Response 201 (shape): includes id, persisted steps, status. Creation is synchronous; first production runs may appear shortly after scheduling or triggers fire.
POST /api/v1/workflows/:id/test — dry run. Optional body keys: sample_data, input, or runtime_payload (same merge; pick one). Response includes test_fixture_profile and final sample_data. Email, outbound webhooks, and CRM steps use [test] logs / stubs — not production sends (see Email: test stubs vs live ESP).
POST …/workflows/:id/test — fixture merge semantics (avoid surprises)
API clients often assume an empty or partial sample_data means “only my keys exist.” In practice the server always starts from a fixture profile, then merges your object.
- Fixture profile — Default is minimal: keys such as
first_name,last_name,email,score. If you send"fixture_profile": "demo"(orfull/rich/legacy), the server adds many extra keys (company_name,industry, segment-style fields, …). The dashboard Test button usesfixture_profile: demo— match it in API tests if you want identical data to the UI. - Shallow merge of your payload — Your
sample_data/input/runtime_payloadis shallow-merged on top of that fixture: for the same top-level key, your value wins. Keys you omit remain from the fixture — so you still seecompany_namein the merged bag when usingdemounless you override or clear it. - Per-step outputs — After each step, the runtime bag is updated by another shallow merge of step outputs. Nested objects are not deep-merged: a step that sets
payloadreplaces a previouspayloadobject entirely.
Tip: To validate templates with a truly minimal bag, send explicit empty strings or a slim fixture_profile and override every key your template references; or rely on test_fixture_profile in the response to confirm which profile ran.
Email and integrations — /test / agent runs vs live enrollments
| Surface | Email / ESP behavior |
|---|---|
POST …/workflows/:id/test | Stubbed. Logs show [test] / “would send” style messages. No live ESP delivery; connectors are not required for most stubs. |
Workflow-type POST …/agents/:id/execute | Follows the agent’s execution path. Treat as production-capable unless your agent or workflow is explicitly test-only: if the run resolves real integration_connections and live modes, email can send for real. |
POST …/enrollments/bulk (live enrollment) | Live path. Steps use step config.integration_id to pick the adapter (e.g. SendGrid). For providers that use org integration connections, the runtime resolves a row in /api/v1/integration_connections (by provider + optional connection_key, default default). Missing or unusable connections can cause skips or errors depending on step type. |
Rule of thumb: /test = safe preview; enrollments bulk = real per-contact execution subject to connections and step config.
POST /api/v1/workflows/:workflow_id/enrollments/bulk — starts one enrollment per contacts[] object (mode: live; real side effects per integration_id and connections). Body: { "contacts": [ { "email": "a@b.com", "first_name": "...", "lead_ref": "crm-123" } ], "timezone": "UTC", "agent_id": 9 }. Optional wrapper: { "enrollment": { "contacts": [ ... ] } }. Link CRM rows: set lead_ref or pass id / uuid / public_id / crm_id / lead_id (first present becomes lead_ref). Require Content-Type: application/json. Responses: 201 with created_count, enrollment_ids, and optional skipped_invalid_rows; 422 when nothing is created (see edge cases). Idempotency: each call creates new rows; dedupe before call or use DELETE .../enrollments/:id for mistakes. Workflow execute agents support idempotency_key instead.
Enrollment bulk — 422 and other error shapes
When no enrollment rows are created, the API returns 422 with a JSON body (not 201 with zero creates). Typical cases:
error (when present) | Meaning |
|---|---|
workflow_archived | Workflow status is archived; enrollments are rejected. |
contacts_required | Body missing a top-level contacts array (or not wrapped correctly in enrollment.contacts). |
contacts_empty | contacts was []. |
no_enrollments_created | Every row was invalid (e.g. non-object entries), wrong Content-Type, or multipart/form instead of JSON objects. |
404 on bulk is used when agent_id is sent but no agent exists in the org. Successful 201 may include skipped_invalid_rows when some array elements were skipped but at least one enrollment was created.
DELETE /api/v1/workflows/:workflow_id/enrollments/:id — deletes that enrollment (stops future ticks for that row). 204 on success.
Enrollment list and detail JSON (including step_funnel on the index) and dashboard parity are documented under Enrollment list, step funnel & dashboard parity above.
CRM → workflow: Create leads with POST /api/v1/crm/leads, then enroll the same person with enrollments/bulk using the returned id as lead_ref or top-level id plus full contact fields for email content.
Webhook step types: The builder "Webhook" input step stores inbound contract metadata only (no hosted ingress URL in-app today). Use Outbound Webhook (webhook_callback) for HTTP out. See workflow guide — webhooks.
Event bridge (recommended for inbound events)
There is no tenant-scoped "POST here to start workflow" URL for arbitrary JSON. The canonical integration pattern is: your server receives the webhook or form POST, then calls enrollments/bulk or agents/execute. Full walkthrough, sample code, and idempotency notes: Event bridge guide.
Pagination: GET /workflows returns a collection for the org; if your client adds page / per_page follow response metadata when present.
Idempotency (workflows): No global header on workflow or enrollment bulk creates — dedupe in your orchestration layer. Prefer idempotency_key on POST /agents/:id/execute when using workflow agents.
Common errors:
| Status | Meaning |
|---|---|
| 400 | Invalid step graph or parameters. |
| 401 | Missing/invalid API key or session. |
| 403 | Insufficient role for workflow write. |
| 404 | Workflow id not in org. |
| 422 | Enrollment bulk and other validation failures — see Enrollment bulk — 422 edge cases. |
API keys
| Method | Path | Description |
|---|---|---|
| GET | /api_keys | List (secrets redacted) |
| POST | /api_keys | Create — full key returned once |
| GET | /api_keys/:id | Show |
| DELETE | /api_keys/:id/revoke | Revoke |
| GET | /api_keys/usage | Usage stats |
API keys — create & revoke
Purpose: Server-side access to /api/v1 on behalf of your organization.
POST /api/v1/api_keys — optional name, optional expires_in (days). The full key string is returned only on create.
{
"name": "Production automation",
"expires_in": 365
}
Response 201 (illustrative):
{
"id": 9,
"name": "Production automation",
"key": "adcrm_live_…",
"key_prefix": "adcrm_live_",
"last_four": "abcd",
"expires_at": null,
"created_at": "2026-04-02T12:00:00Z",
"message": "Save this API key now! You won't be able to see it again."
}
GET /api/v1/api_keys — listed keys omit full secret (redacted).
DELETE /api/v1/api_keys/:id/revoke — invalidates the key; clients should rotate before revoking the last working credential.
Common errors: 401 if calling without session/key to create; 422 validation on name or limits.
Reports
| Method | Path | Description |
|---|---|---|
| GET | /reports | List |
| POST | /reports/generate | Generate report |
| GET | /reports/:id | Show |
| DELETE | /reports/:id | Destroy |
| GET | /reports/:id/download | Download artifact |
| POST | /reports/:id/schedule | Schedule |
Account & billing (account)
| Method | Path | Description |
|---|---|---|
| GET | /account | Organization / profile |
| PATCH | /account | Update account |
| GET | /account/billing | Billing summary |
| PATCH | /account/billing | Update billing fields |
Analytics
GET /analytics/metrics GET /analytics/charts
Monitoring
GET /monitoring/agents GET /monitoring/reasoning/:agent_id
Reports & monitoring — quick usage
Reports: POST /api/v1/reports/generate accepts a report type and parameters in JSON; GET /api/v1/reports/:id polls completion; GET .../download fetches the artifact when ready.
Monitoring: GET /api/v1/monitoring/agents returns fleet signals; GET /api/v1/monitoring/reasoning/:agent_id surfaces reasoning-oriented diagnostics when enabled.
Common errors: 404 missing report/agent; 429 if heavy generation is throttled—retry with backoff.
Operational playbooks: Monitoring & troubleshooting.
Integration connections
Slack, HubSpot, Salesforce, SendGrid, Google Workspace, Microsoft 365, Stripe, Zoom, Zendesk, Gong, etc.
GET/POST /integration_connections GET/PATCH/DELETE /integration_connections/:id
Integrations — usage notes
Purpose: Store OAuth or API credentials for downstream systems your workflows and agents call.
Auth: Bearer required. Responses include connection type and status; secrets are never returned in full after creation.
Side effects: Creating or refreshing a connection may trigger a test call to the provider; failures surface as 4xx with an explanatory message.
Common errors: 400/422 invalid tokens; 409 duplicate connection type when only one is allowed per org.
Workflow steps: integration_id vs connections — Step config.integration_id picks the adapter (e.g. sendgrid, hubspot, slack). For providers that use ConnectorDispatcher, the runtime resolves a row in /integration_connections by provider + optional connection_key (defaults to default). If no usable connection exists, live CRM/email may fail or audit-skip depending on the step. Test mode (POST .../test) does not require connections: email shows [test] Would send…; SendGrid is still skipped without a connection; tracked nurture sends need a live enrollment and app mailer configuration.
integration_id (examples) | Live behavior (summary) |
|---|---|
sendgrid / sg | Uses SendGrid integration_connection; sends real mail when configured. |
nurture, internal, open-tracking paths | Tracked / nurture mailer path (enrollment context required for opens pixel). |
hubspot / hs, salesforce / sf | CRM steps call connector when a matching connection exists; [test] stubs in dry run. |
slack | Alert steps post when a Slack connection exists. |
External tool adapters (direct integration layer)
Supported provider keys: google_workspace, microsoft365, slack, salesforce, hubspot, stripe, sendgrid, zoom, zendesk, gong.
Aliases: gmail -> google_workspace, outlook/office365 -> microsoft365, sf/sfdc -> salesforce, hs -> hubspot, sg -> sendgrid.
Workflow invocation: Use step type integration_action with config.integration_id, config.action, config.payload, and optional config.connection_key.
{
"type": "integration_action",
"name": "Create support ticket",
"config": {
"integration_id": "zendesk",
"action": "create_ticket",
"connection_key": "default",
"payload": {
"subject": "Help needed for {{email}}",
"description": "Workflow generated issue summary",
"requester_email": "{{email}}"
}
}
}
Guardrails: keep secrets only in /integration_connections; pass references in workflow config; runtime resolves credentials server-side; responses hide secret values after creation.
Full integration guide with action map: External tool adapters.
Data sources & runs
| Method | Path | Description |
|---|---|---|
| GET | /data_sources | List |
| POST | /data_sources | Create |
| GET | /data_sources/:id | Show |
| PATCH | /data_sources/:id | Update |
| DELETE | /data_sources/:id | Destroy |
| POST | /data_sources/:id/preview | Preview import |
| POST | /data_source_runs | Start run |
| GET | /data_source_runs/:id | Run status |
CRM starter layer
Org-scoped CRM under /api/v1/crm/…. Full import/export and pipeline concepts: CRM data portability, Opportunity pipelines & Kanban.
Export & import; change events
| Method | Path | Description |
|---|---|---|
| GET | /crm/export | JSON bundle (accounts, contacts, opportunities with pipeline_id / pipeline_stage_id, leads, activities) |
| POST | /crm/import | Upsert same shape |
| GET | /crm/change_events | Audit stream (optional filters) |
Opportunity pipelines
| Method | Path | Description |
|---|---|---|
| GET | /crm/opportunity_pipelines | List pipelines + nested stages; default_pipeline_id |
| POST | /crm/opportunity_pipelines | Clone org default to user pipeline ({ "pipeline": { "name" } }) |
| PATCH | /crm/opportunity_pipelines/:id | Update user-owned pipeline (name, stages) |
| DELETE | /crm/opportunity_pipelines/:id | Delete if empty |
| POST | /crm/opportunity_pipelines/:id/set_default | Set user default pipeline |
Accounts, contacts, opportunities, leads, activities
Standard REST collections; each supports CSV import on POST …/import_csv where listed in routes.
| Method | Path | Notes |
|---|---|---|
| GET | /crm/accounts … /crm/accounts/:id | CRUD + destroy (soft delete) |
| GET | /crm/contacts … | CRUD |
| GET | /crm/opportunities | Query: pipeline_id, q, filters; opportunity objects include name, pipeline_id, pipeline_stage_id, stage_position |
| POST | /crm/opportunities/reorder | Body: pipeline_stage_id, ordered_ids (public_id or UUID) |
| GET | /crm/leads … | CRUD |
| GET | /crm/activities … | CRUD |
Billing (Stripe)
| Method | Path | Description |
|---|---|---|
| GET | /billing | Subscription state |
| POST | /billing/subscribe | Create subscription |
| POST | /billing/cancel | Cancel |
| POST | /billing/reactivate | Reactivate |
| GET | /billing/payment-methods | List payment methods |
| POST | /billing/checkout | Stripe Checkout session |
Inbound webhooks & tracking (no Bearer auth)
These use provider signatures, shared secrets, or are public tracking endpoints—not your org API key.
| Method | Path | Notes |
|---|---|---|
| POST | /webhooks/stripe | Stripe webhook |
| POST | /webhooks/lead_scoring | Lead scorer inbound (signed) |
| POST | /webhooks/nurture/bounce | ESP bounce / complaint |
| GET | /track/n/pixel.gif | Open pixel |
| GET | /track/n/click | Click redirect |
| GET / POST | /track/n/unsubscribe | List-unsubscribe |
OAuth (browser)
Google sign-in starts outside JSON API:
GET /auth/google_oauth2 GET /auth/google_oauth2/callback
Try it
- Read the quickstart.
- Download the agent skills pack (includes an OpenAPI starter spec).
- Sign in and create an API key.
- Call
GET /api/v1/agentswithAuthorization: Bearer …
DripPulse · drippulse.io · Documentation home