@myapihq/cli 2.9.0 → 2.11.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.
Files changed (50) hide show
  1. package/dist/commands/container.js +35 -14
  2. package/dist/commands/flag-reachability.test.js +14 -4
  3. package/dist/commands/import-key.test.d.ts +1 -0
  4. package/dist/commands/import-key.test.js +69 -0
  5. package/dist/commands/org.js +5 -1
  6. package/dist/commands/setup.d.ts +5 -1
  7. package/dist/commands/setup.js +67 -6
  8. package/dist/commands/storage.js +151 -14
  9. package/dist/config.d.ts +2 -0
  10. package/dist/errors.d.ts +4 -0
  11. package/dist/errors.js +36 -3
  12. package/dist/helpers.d.ts +20 -1
  13. package/dist/helpers.js +79 -1
  14. package/dist/index.js +6 -1
  15. package/dist/org-not-found.test.d.ts +1 -0
  16. package/dist/org-not-found.test.js +42 -0
  17. package/dist/org-notice.test.d.ts +1 -0
  18. package/dist/org-notice.test.js +37 -0
  19. package/dist/output.d.ts +6 -0
  20. package/dist/output.js +8 -1
  21. package/dist/skills/my-api-hq/SKILL.md +34 -14
  22. package/dist/skills/my-audience-api/SKILL.md +16 -1
  23. package/dist/skills/my-auth-api/SKILL.md +17 -2
  24. package/dist/skills/my-company-api/SKILL.md +16 -1
  25. package/dist/skills/my-container-api/SKILL.md +45 -24
  26. package/dist/skills/my-crm-api/SKILL.md +16 -1
  27. package/dist/skills/my-database-api/SKILL.md +13 -17
  28. package/dist/skills/my-domain-api/SKILL.md +16 -1
  29. package/dist/skills/my-email-api/SKILL.md +12 -16
  30. package/dist/skills/my-email-verify-api/SKILL.md +16 -1
  31. package/dist/skills/my-feedback-api/README.md +33 -0
  32. package/dist/skills/my-feedback-api/SKILL.md +118 -0
  33. package/dist/skills/my-feedback-api/claude/.claude-plugin/plugin.json +7 -0
  34. package/dist/skills/my-function-api/README.md +34 -0
  35. package/dist/skills/my-function-api/SKILL.md +16 -1
  36. package/dist/skills/my-funnel-api/SKILL.md +16 -1
  37. package/dist/skills/my-git-api/SKILL.md +17 -1
  38. package/dist/skills/my-image-api/SKILL.md +17 -1
  39. package/dist/skills/my-llm-api/SKILL.md +20 -6
  40. package/dist/skills/my-payments-api/README.md +33 -0
  41. package/dist/skills/my-payments-api/SKILL.md +16 -1
  42. package/dist/skills/my-people-api/SKILL.md +16 -1
  43. package/dist/skills/my-pixel-api/SKILL.md +26 -3
  44. package/dist/skills/my-queue-api/SKILL.md +35 -2
  45. package/dist/skills/my-storage-api/SKILL.md +37 -29
  46. package/dist/skills/my-task-api/SKILL.md +35 -2
  47. package/dist/skills/my-url-to/SKILL.md +16 -1
  48. package/dist/skills/my-webhook-api/SKILL.md +23 -3
  49. package/dist/skills/my-workflow-api/SKILL.md +32 -6
  50. package/package.json +2 -2
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Register new domains and manage edge settings. Required before a funnel can go live on a custom URL.
6
6
  triggers: [domain, register domain, dns, custom domain, edge, cdn, security level, browser check, renew, namecheap]
7
- checksum: sha256-6a686b453528c69dcc791db409c04a514422951abf333c8feed7c614311815cb
7
+ checksum: sha256-ffe00d434534f444320a3e84323e87168c0c5797445fa0f39eeb55ad8278f721
8
8
  ---
9
9
 
10
10
  # MyDomainAPI
@@ -133,4 +133,19 @@ myapi domain records create <domain> --type CNAME --name app --content x.com --p
133
133
  reassign path, so pass `--org` explicitly and check `domain list --filter all`
134
134
  first.
135
135
 
136
+ ## HTTP (from deployed code)
137
+
138
+ <!-- http:start -->
139
+ <!-- generated by `npm run canonical-sync` — do not edit -->
140
+ ```
141
+ base https://api.mydomainapi.com
142
+ path GET /domain/orgs/{org_id}/list
143
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
144
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
145
+ ```
146
+
147
+ - **Per-slot host** — do not assume one host serves every slot.
148
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
149
+ <!-- http:end -->
150
+
136
151
  Run `myapi domain --help` or `myapi domain <subcommand> --help` for full flag reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Send transactional and bulk email from your own domain. Create mailboxes, send/receive messages, generate AI templates, and manage warmup.
6
6
  triggers: [email, mailbox, send email, transactional email, template, warmup, inbox, outbox, ses, sender reputation]
7
- checksum: sha256-aa22381613affcff041a8d51d2acb2ba657fecefc97f4feba45958bcc11b2e06
7
+ checksum: sha256-98aedd0274a450fdd68a2d0cfe3a8af33520c58b2ce6e7cfaee7840fd5526aa6
8
8
  ---
9
9
 
10
10
  # MyEmailAPI
@@ -64,6 +64,7 @@ myapi email warmup stats --address hello@yourdomain.com
64
64
 
65
65
  - A mailbox is uniquely identified by its address (`username@domain`).
66
66
  - Sending is opt-in per mailbox. Newly-created mailboxes can receive but not send until `activate-sending` runs.
67
+ - **`402`** — `INSUFFICIENT_FUNDS`: top up or enable `myapi billing auto-recharge`. `SPEND_CAP_EXCEEDED`: raise your own ceiling with `myapi billing spend-cap`.
67
68
  - Templates are org-scoped. Set a default org once: `myapi config set-org <id>`.
68
69
 
69
70
 
@@ -81,24 +82,19 @@ Two things that read as contradictory and are not:
81
82
  to run Google Workspace or another provider on the apex, check the existing
82
83
  records first with `myapi domain records <domain>`.
83
84
 
84
- ## Calling this from deployed code (HTTP)
85
-
86
- The CLI is not what runs in production — a deployed function or container calls
87
- the HTTP API directly. That surface was previously only discoverable by
88
- grepping the CLI bundle, which cost one team an hour per slot.
85
+ ## HTTP (from deployed code)
89
86
 
87
+ <!-- http:start -->
88
+ <!-- generated by `npm run canonical-sync` — do not edit -->
90
89
  ```
91
- base https://api.myemailapi.com ← not the gateway
92
- path /email/mailboxes · /email/orgs/{org_id}/messages/send
93
- auth Authorization: Bearer <api key>
94
- (inside a function: env.__MYAPI_KEY · inside a container: env.MYAPI_KEY)
95
- body application/json
96
- reply { "success": true, "data": …, "error": null, "meta": {…} }
97
- Unwrap `data`. On failure `success` is false and `error` is
98
- { code, message }.
90
+ base https://api.myemailapi.com
91
+ path POST /email/send
92
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
93
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
99
94
  ```
100
95
 
101
- **The org id goes in the PATH, not a header.** There is no `X-Org-Id`.
102
- **Base URLs differ per slot** — do not assume one host for everything.
96
+ - **Per-slot host** do not assume one host serves every slot.
97
+ - **Account-scoped, not org-scoped** — no `{org_id}` segment; the key identifies the account.
98
+ <!-- http:end -->
103
99
 
104
100
  Run `myapi email --help` or `myapi email <namespace> --help` for full flag reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Synchronous single-address email verification — syntax + DNS + Microsoft GetCredentialType probe. Returns a verdict in <1s for ~50% of inputs; the rest get verdict='unknown' with smtp_recommended=true. The pre-send quality gate for any outbound campaign.
6
6
  triggers: [email verify, email validation, deliverability, smtp, syntax check, dns mx, microsoft, mx lookup, bounce prevention]
7
- checksum: sha256-a8f4d3fa04436c997d02d1d33f262190166e59e3e890b1c40a877bbd49ad3f00
7
+ checksum: sha256-c8ae836c355066eee8a12753f818d3a90c35b99983d74913c8fc76edcc99668f
8
8
  ---
9
9
 
10
10
  # MyEmailVerifyAPI
@@ -90,4 +90,19 @@ done < emails.txt | grep -v ' undeliverable$' > verified.txt
90
90
  - For bulk verification use the async batch endpoint: `myapi email verify bulk < emails.txt` (one address per line) returns a `job_id`, then poll `myapi email verify job <job_id>` for status + per-address results.
91
91
  - Verification is per-org; you'll get rate-limited if you blast more than ~1 req/sec per key.
92
92
 
93
+ ## HTTP (from deployed code)
94
+
95
+ <!-- http:start -->
96
+ <!-- generated by `npm run canonical-sync` — do not edit -->
97
+ ```
98
+ base https://api.myemailapi.com
99
+ path POST /email/orgs/{org_id}/verify
100
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
101
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
102
+ ```
103
+
104
+ - **Per-slot host** — do not assume one host serves every slot.
105
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
106
+ <!-- http:end -->
107
+
93
108
  Run `myapi email verify --help` for inline reference.
@@ -0,0 +1,33 @@
1
+ ---
2
+ # my-feedback-api
3
+
4
+ The loop back from the people using what you built. A page collects feedback with a public widget key that authenticates nobody; you read, filter, and close it.
5
+
6
+ ## What it does
7
+
8
+ - Public widget keys — embed in page source, restrict by origin, revoke without losing collected feedback
9
+ - Three kinds (`bug` | `issue` | `suggestion`), chosen by the reporter rather than inferred
10
+ - Filterable listing by kind and status, newest first, paged with `--limit` / `--offset`
11
+ - `resolve` closes an item; unknown ids answer identically so ids can't be probed across orgs
12
+
13
+ ## Quickstart
14
+
15
+ ```bash
16
+ myapi feedback widget create marketing --origins example.com,www.example.com
17
+ myapi feedback list --status open
18
+ myapi feedback resolve <id>
19
+ ```
20
+
21
+ ## Authentication
22
+
23
+ ```bash
24
+ export MYAPI_KEY=hq_live_...
25
+ ```
26
+
27
+ Requires `api_key` + `org_id` from **myapihq**. The widget key is separate and deliberately public — it goes in your page source.
28
+
29
+ ## Documentation
30
+
31
+ Full command reference and why `kind` is a claim rather than a guess: see `SKILL.md`.
32
+
33
+ Run `myapi feedback --help` for inline reference.
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: my-feedback-api
3
+ version: 1.0.0
4
+ description: >
5
+ Collect feedback from the people using what you built. A public widget key lets a page submit without a credential; you list, filter and resolve the results. Kind is chosen by the person reporting, not inferred from their wording.
6
+ triggers: [feedback, bug report, user feedback, feature request, widget, support, complaints, praise]
7
+ checksum: sha256-41627c4bdf19a5af131adc0e7bab76816e7be47acdc15601bdcef7cdb47b2e26
8
+ ---
9
+
10
+ # MyFeedbackAPI
11
+
12
+ The loop back from the people using your product. A page collects feedback with
13
+ a public key that authenticates nobody; you read, filter and close it.
14
+
15
+ ## Capabilities
16
+ <!-- llm:start -->
17
+ Two halves: a **widget key** a page embeds, and the **items** it produces.
18
+
19
+ ### The widget key is public, and that is the point
20
+
21
+ `myapi feedback widget create <name>` mints a key that ships in your page
22
+ source. It is **not a secret** — it names your org so a visitor can submit
23
+ without signing in, and it authenticates nobody.
24
+
25
+ Treating it as a credential is the mistake to avoid: people hide it, and then
26
+ the widget cannot work. What it does need is `--origins`, so another site
27
+ cannot post through it:
28
+
29
+ ```bash
30
+ myapi feedback widget create site --origins app.example.com,example.com
31
+ ```
32
+
33
+ Revoke with `myapi feedback widget revoke <id>`. Submissions stop immediately;
34
+ feedback already collected is kept.
35
+
36
+ **The browser-side submit contract is not documented yet.** The CLI and SDK
37
+ cover minting, revoking, listing and resolving; how a page posts with only the
38
+ widget key is not published anywhere you can read it, so don't guess the
39
+ endpoint. Until it lands, collect through a route you control — a funnel form
40
+ (`my-funnel-api`) or a webhook (`my-webhook-api`) — and file items with
41
+ `myapi feedback create`.
42
+
43
+ ### Kind is a claim, not a guess
44
+
45
+ `--kind` is one of `bug`, `issue`, `suggestion`, and it is **what the person
46
+ reporting says it is**. Someone filing a `bug` is telling you
47
+ they believe the product is broken — which is a different and more urgent
48
+ signal than a wish for something new. Do not re-classify from the wording.
49
+
50
+ Classification and duplicate-grouping exist in the platform's design and are
51
+ not built yet, so treat `kind` as the person's own label rather than a
52
+ processed signal.
53
+
54
+ ### Reading it back
55
+
56
+ `myapi feedback list` is newest first, filterable by `--kind` and `--status`
57
+ (`open` | `resolved`), paged with `--limit` / `--offset`. **`total` is the
58
+ number of matches, not the size of the page**, and `has_more` flags a truncated
59
+ result — both describe the whole match set.
60
+
61
+ `myapi feedback resolve <id>` closes an item. An unknown id answers the same
62
+ way as an already-resolved one, so a success is not proof the item existed —
63
+ that is deliberate, so ids cannot be probed across orgs.
64
+ <!-- llm:end -->
65
+
66
+ ## Commands
67
+ <!-- generated:start -->
68
+ | Command | What it does |
69
+ |---|---|
70
+ | `myapi feedback create "<text>" --kind <k>` | Record one item (`--page-url`, `--route` for context) |
71
+ | `myapi feedback list [--kind bug\|issue\|suggestion] [--status open\|resolved] [--limit N] [--offset N]` | List feedback, newest first |
72
+ | `myapi feedback resolve <id>` | Close an item |
73
+ | `myapi feedback widget create <name> [--origins a.com,b.com]` | Mint a PUBLIC widget key for a site |
74
+ | `myapi feedback widget revoke <id>` | Revoke a key; collected feedback is kept |
75
+ <!-- generated:end -->
76
+
77
+ ## Examples
78
+ <!-- llm:start -->
79
+ ```bash
80
+ # 1. Mint a key for your site. Restrict the origins.
81
+ myapi feedback widget create marketing --origins example.com,www.example.com
82
+ # → prints a PUBLIC key to embed in the page
83
+
84
+ # 2. Read what came back, newest first
85
+ myapi feedback list --status open
86
+ myapi feedback list --kind bug --limit 20
87
+
88
+ # 3. Record something yourself (support call, your own testing)
89
+ myapi feedback create "checkout 500s on the second attempt" --kind bug \
90
+ --route /checkout
91
+
92
+ # 4. Close it
93
+ myapi feedback resolve <id>
94
+ ```
95
+ <!-- llm:end -->
96
+
97
+ ## Notes
98
+
99
+ - The widget key is public by design — restrict it with `--origins` rather than hiding it.
100
+ - `resolve` is idempotent and deliberately indistinguishable from an unknown id.
101
+ - Feedback survives widget revocation.
102
+
103
+ ## HTTP (from deployed code)
104
+
105
+ <!-- http:start -->
106
+ <!-- generated by `npm run canonical-sync` — do not edit -->
107
+ ```
108
+ base https://api.myapihq.com
109
+ path POST /feedback/orgs/{org_id}/widgets
110
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
111
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
112
+ ```
113
+
114
+ - **Per-slot host** — do not assume one host serves every slot.
115
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
116
+ <!-- http:end -->
117
+
118
+ Run `myapi feedback --help` for the full flag reference.
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "my-feedback-api",
3
+ "description": "Collect feedback from the people using what you built. A public widget key lets a page submit without a credential; you list, filter, and resolve the results.",
4
+ "version": "1.0.0",
5
+ "status": "preview",
6
+ "published": true
7
+ }
@@ -0,0 +1,34 @@
1
+ ---
2
+ # my-function-api
3
+
4
+ Deploy JavaScript to the MyAPI edge runtime. Register a function, upload a single-file bundle, and it goes live on a public invocation URL — or runs on a cron schedule.
5
+
6
+ ## What it does
7
+
8
+ - Two-step lifecycle: `create` registers and mints a scoped key, `deploy` ships a ≤4MB single-file bundle
9
+ - HTTP or cron triggers, fixed at create time
10
+ - Scoped capability key, org-locked, narrowable with `--scope <slot>,...` — a function never out-reaches the credential that made it
11
+ - The key is injected as `env.__MYAPI_KEY` and stays current across deploys
12
+ - Encrypted secrets via `fn env`, invocation history via `fn runs`
13
+
14
+ ## Quickstart
15
+
16
+ ```bash
17
+ myapi fn create --name my-app-api
18
+ myapi fn deploy fn_abc123 ./dist/bundle.js
19
+ myapi fn runs fn_abc123
20
+ ```
21
+
22
+ ## Authentication
23
+
24
+ ```bash
25
+ export MYAPI_KEY=hq_live_...
26
+ ```
27
+
28
+ Requires `api_key` + `org_id` from **myapihq**.
29
+
30
+ ## Documentation
31
+
32
+ Full command reference, the `__MYAPI_KEY` injection contract, and why `--scope` is effectively permanent: see `SKILL.md`.
33
+
34
+ Run `myapi fn --help` for inline reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Deploy JavaScript functions to the MyAPI edge runtime. Register a function, upload a single-file JS bundle, get a live HTTP invocation URL or run it on a cron schedule. Each function gets a scoped capability key for cross-slot calls.
6
6
  triggers: [function, deploy function, edge function, serverless, cloudflare worker, cron, scoped api key, capability key, invocation url, bundle]
7
- checksum: sha256-a29b3c96645c59317c0896c9a886d9904bdb2ebde9eb8582d0cb7071d0b9ac2c
7
+ checksum: sha256-0ab1d08fb6c9cc917fd3d1aa5d730ff3e4fe5dd37e8e30ebe225085593139cca
8
8
  ---
9
9
 
10
10
  # MyFunctionAPI
@@ -135,4 +135,19 @@ curl -H "Authorization: Bearer $SCOPED_KEY" \
135
135
  handed out — docs, front-end config, webhooks, anything given to a third
136
136
  party. Decide the full slot list before you publish the URL.
137
137
 
138
+ ## HTTP (from deployed code)
139
+
140
+ <!-- http:start -->
141
+ <!-- generated by `npm run canonical-sync` — do not edit -->
142
+ ```
143
+ base https://api.myapihq.com
144
+ path POST /function/orgs/{org_id}/functions
145
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
146
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
147
+ ```
148
+
149
+ - **Per-slot host** — do not assume one host serves every slot.
150
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
151
+ <!-- http:end -->
152
+
138
153
  Run `myapi fn --help` or `myapi fn <subcommand> --help` for full flag reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Create and publish websites (funnels) to the edge. Push raw HTML to any slug and it goes live instantly on your org's domain or preview subdomain.
6
6
  triggers: [funnel, landing page, website, page, publish, push, slug, html, edge, preview subdomain, makeautonomous]
7
- checksum: sha256-849afbb7c2c60ea88c3476d50bf51289b77cedc819a0c2b69787075ff9c23b4b
7
+ checksum: sha256-24c12e48a6153087641369319ac67e79c1fa36b950b140621d1e118128755b53
8
8
  ---
9
9
 
10
10
  # MyFunnelAPI
@@ -121,4 +121,19 @@ myapi funnel form <funnel_id> --slug survey \
121
121
  - Deleting a funnel purges all its edge pages immediately.
122
122
  - `402 INSUFFICIENT_FUNDS` → top up (`myapi billing topup`) or enable `myapi billing auto-recharge`.
123
123
 
124
+ ## HTTP (from deployed code)
125
+
126
+ <!-- http:start -->
127
+ <!-- generated by `npm run canonical-sync` — do not edit -->
128
+ ```
129
+ base https://api.myfunnelapi.com
130
+ path POST /funnel/orgs/{org_id}/funnels
131
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
132
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
133
+ ```
134
+
135
+ - **Per-slot host** — do not assume one host serves every slot.
136
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
137
+ <!-- http:end -->
138
+
124
139
  Run `myapi funnel --help` or `myapi funnel <subcommand> --help` for full flag reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Hosted git repositories over HTTP. Create repos, read history (log/show/tree/blob/diff), and write atomically (commit/branch/tag/merge) — no clone needed. Real `git clone`/`push` also work over HTTPS with your API key as the password.
6
6
  triggers: [git, repo, repository, clone, push, commit, branch, tag, merge, diff, version control, source control, vcs]
7
- checksum: sha256-417bafc3e56707f637937f98341d6200c8a9bb6ad5d0b13f84f7b6810e0340f5
7
+ checksum: sha256-0ce9ebdde1ec29160d186ab0e4fb254d47473af3b57829f0156845bfb08c4ab1
8
8
  ---
9
9
 
10
10
  # MyGitAPI
@@ -117,6 +117,7 @@ surface never leaks which repos exist).
117
117
  - **`commit --base`** is the concurrency guard: pass the expected tip SHA to reject a stale write, or `--base ""` to require the branch be newly created. Omit it to create-or-update.
118
118
  - **Metering.** A `git push` (and `myapi git commit`) is metered like a commit. Clone/fetch (`upload-pack`) is free.
119
119
  - **Limits.** A push body is capped at 100 MiB; per-repo size limits apply (a push past the cap is reported as a receive-pack failure).
120
+ - **`402`** — `INSUFFICIENT_FUNDS`: top up or enable `myapi billing auto-recharge`. `SPEND_CAP_EXCEEDED`: raise your own ceiling with `myapi billing spend-cap`.
120
121
  - **Auth field.** git may put the API key in the username or password slot — both work. Embedding it in the URL (`https://x:$KEY@…`) avoids the interactive prompt but writes the API key into `.git/config`; use a credential helper for anything persistent.
121
122
 
122
123
  ## Commit authorship
@@ -125,4 +126,19 @@ surface never leaks which repos exist).
125
126
  author. Without them the commit is attributed to the API key's account, which
126
127
  makes every agent-written commit look like the same person.
127
128
 
129
+ ## HTTP (from deployed code)
130
+
131
+ <!-- http:start -->
132
+ <!-- generated by `npm run canonical-sync` — do not edit -->
133
+ ```
134
+ base https://api.myapihq.com
135
+ path POST /git/orgs/{org_id}/repos
136
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
137
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
138
+ ```
139
+
140
+ - **Per-slot host** — do not assume one host serves every slot.
141
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
142
+ <!-- http:end -->
143
+
128
144
  Run `myapi git --help` for the full flag reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Generate AI images from a text prompt. Async — submit a prompt, the CLI polls until the image is ready, then returns a public CDN URL. Image lands automatically in your org's storage.
6
6
  triggers: [image, generate image, ai image, hero image, logo, illustration, watercolor, prompt, cyberpunk, ratio, aspect ratio]
7
- checksum: sha256-17f496ae8c575743872e87c5c3b281e621b3557ef3ff9eeb0b3d664ec4212e57
7
+ checksum: sha256-c12686cd9f53f18dbc692c3aca9391409cc1540b693b6f2059074e02bafff72c
8
8
  ---
9
9
 
10
10
  # MyImageAPI
@@ -73,6 +73,22 @@ Tips for agents:
73
73
 
74
74
  - Cost is per-image at the selected model's catalog rate (`myapi image models`). Failed jobs aren't charged.
75
75
  - The asset URL is public — don't generate sensitive content.
76
+ - **`402`** — `INSUFFICIENT_FUNDS`: top up or enable `myapi billing auto-recharge`. `SPEND_CAP_EXCEEDED`: raise your own ceiling with `myapi billing spend-cap`.
76
77
  - `delete` is permanent for the asset; the job record (prompt + metadata) stays for history. Look before you delete: `myapi image list` first, pass `--org` explicitly; delete verbs require `--yes` in non-interactive runs.
77
78
 
79
+ ## HTTP (from deployed code)
80
+
81
+ <!-- http:start -->
82
+ <!-- generated by `npm run canonical-sync` — do not edit -->
83
+ ```
84
+ base https://api.myimageapi.com
85
+ path POST /image/orgs/{org_id}/generate
86
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
87
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
88
+ ```
89
+
90
+ - **Per-slot host** — do not assume one host serves every slot.
91
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
92
+ <!-- http:end -->
93
+
78
94
  Run `myapi image --help` or `myapi image <subcommand> --help` for full flag reference.
@@ -7,7 +7,7 @@ description: >
7
7
  (classify / extract / summarize / draft) that hide the model behind a
8
8
  task. Pricing in cents per 1M tokens; charged from your MyAPI balance.
9
9
  triggers: [llm, completion, chat, embed, embedding, inference, classify, extract, summarize, draft, qwen]
10
- checksum: sha256-2a9070e118134aea98a1be986d29f9c4e3a969aa960e7dfc87137bbc490ac04e
10
+ checksum: sha256-d89e5c7ccadb7e967f97ec201b745f2313e4263f8f08a695f4cc9fbaa0c4b500
11
11
  ---
12
12
 
13
13
  # MyLLMAPI
@@ -17,8 +17,6 @@ A two-surface LLM gateway:
17
17
  - **Raw** — `complete` / `embed` / `models`. You pick a self-hosted catalog model (run `myapi llm models` for the live list). Proprietary models are not callable here.
18
18
  - **Verbs** — `classify` / `extract` / `summarize` / `draft`. You ask for a task done; the model is implementation detail.
19
19
 
20
- Pricing is cents per 1M tokens at the actual upstream rate, debited from your MyAPI balance.
21
-
22
20
  ## Capabilities
23
21
  <!-- llm:start -->
24
22
  For workflow tasks — summarize, classify, extract, draft. The reply goes to stdout and the usage footer (tokens, cost, finish reason) to stderr, so `myapi llm complete ... | jq` works.
@@ -112,7 +110,7 @@ r = client.chat.completions.create(model="<model-id>",
112
110
  | `myapi llm classify "<input>" --labels <csv> [--multi] [--tier <t>] [--json]` | Pick a label from a set |
113
111
  | `myapi llm extract "<input>" --schema <path\|json> [--tier <t>] [--json]` | Pull structured data conforming to a JSON Schema |
114
112
  | `myapi llm summarize "<input>" [--style brief\|exec\|bullet] [--tier <t>] [--json]` | Summarize text |
115
- | `myapi llm draft --kind <what> [--prompt "<s>"] [--context <json>] ["<src>"] [--tier <t>] [--json]` | Draft an email / reply / message / … |
113
+ | `myapi llm draft --kind <what> [--prompt "<s>"] [--facts <json>] [--directives <json>] ["<src>"] [--tier <t>] [--json]` | Draft an email / reply / message / … |
116
114
  <!-- generated:end -->
117
115
 
118
116
  Pass `-` as the prompt/input to read from stdin. Pass `--file <path>` to read longer content from disk.
@@ -145,7 +143,7 @@ myapi llm summarize --file long-thread.txt --style bullet
145
143
 
146
144
  myapi llm draft --kind email \
147
145
  --prompt "Friendly welcome, under 60 words." \
148
- --context '{"recipient":"a new signup","product":"MyAPI"}'
146
+ --facts '{"recipient":"a new signup","product":"MyAPI"}'
149
147
 
150
148
  # Classify + route an inbound webhook delivery
151
149
  BODY=$(myapi webhook delivery <id> --json | jq -r '.body')
@@ -156,7 +154,8 @@ INTENT=$(printf '%s' "$BODY" | myapi llm classify - \
156
154
 
157
155
  ## Notes
158
156
 
159
- - **`draft` context safety.** `context` fields are quoted into the prompt verbatim; sensitive-named keys (`secret`, `api_key`, `password`, …) are NOT redacted. Two guards on top: (a) injection-defense strips `instructions`/`system`/`prompt`/`override` keys and surfaces them in `meta.warnings`; (b) output guardrail substring-scans fact values (length 4) in the response and lists matches in `meta.guardrails.facts_in_output` (signal, not redaction). Rule of thumb: never put credentials, PII, or internal metadata in `context` — pass identifiers, reference them indirectly.
157
+ - **`draft --facts` safety.** Fact values are quoted into the prompt verbatim and sensitive-named keys (`secret`, `api_key`, `password`, …) are NOT redacted. Two guards: injection-defense strips `instructions`/`system`/`prompt`/`override` keys into `meta.warnings`; an output guardrail substring-scans fact values (≥4 chars) and lists hits in `meta.guardrails.facts_in_output` (signal, not redaction). Never put credentials, PII, or internal metadata in `--facts` — pass identifiers and reference them indirectly.
158
+ - **`402`** — `INSUFFICIENT_FUNDS`: top up or enable `myapi billing auto-recharge`. `SPEND_CAP_EXCEEDED`: raise your own ceiling with `myapi billing spend-cap`.
160
159
  - **Self-hosted raw, server-picked verbs.** Raw runs on MyAPI's TPU; verbs route wherever the server picks.
161
160
  - **Cost + latency.** `usage.cost_cents` is authoritative — no markup. Varies by tier: 200–600 ms to first token, 1–3 s end-to-end.
162
161
  - **Live catalog, no streaming, no BYOK.** Don't hard-code ids — `models` is truth (CLI auto-picks if `--model` omitted). Full reply only.
@@ -173,3 +172,18 @@ myapi llm draft --kind email --prompt "the invoice is due" \
173
172
  ```
174
173
 
175
174
  `--context` is the old name for `--facts`; accepted, deprecated upstream.
175
+
176
+ ## HTTP (from deployed code)
177
+
178
+ <!-- http:start -->
179
+ <!-- generated by `npm run canonical-sync` — do not edit -->
180
+ ```
181
+ base https://api.myapihq.com
182
+ path POST /llm/orgs/{org_id}/complete
183
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
184
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
185
+ ```
186
+
187
+ - **Per-slot host** — do not assume one host serves every slot.
188
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
189
+ <!-- http:end -->
@@ -0,0 +1,33 @@
1
+ ---
2
+ # my-payments-api
3
+
4
+ Take payments via Stripe. Connect your own Stripe account, then create hosted Checkout URLs for one-off or recurring charges. No raw card data touches your code.
5
+
6
+ ## What it does
7
+
8
+ - Bring your own Stripe key (T0) — your account stays the merchant of record
9
+ - One verb for both models: `charge --amount 9.99`, or add `--every month|year` for a subscription
10
+ - Returns a hosted Stripe Checkout URL to paste into a frontend, email, or redirect
11
+ - Full refunds; list and inspect charges
12
+
13
+ ## Quickstart
14
+
15
+ ```bash
16
+ myapi payments connect --stripe-key sk_live_...
17
+ myapi payments charge --amount 9.99 --description "Pro plan upgrade"
18
+ myapi payments refund <charge_id>
19
+ ```
20
+
21
+ ## Authentication
22
+
23
+ ```bash
24
+ export MYAPI_KEY=hq_live_...
25
+ ```
26
+
27
+ Requires `api_key` + `org_id` from **myapihq**, plus your own Stripe secret key.
28
+
29
+ ## Documentation
30
+
31
+ Full command reference and what is deliberately not available yet (T1 Connect Express, partial refunds, coupons, Stripe Tax): see `SKILL.md`.
32
+
33
+ Run `myapi payments --help` for inline reference.
@@ -4,7 +4,7 @@ version: 1.1.0
4
4
  description: >
5
5
  Take payments via Stripe — one-off or recurring. Connect your own Stripe account, then create hosted Stripe Checkout URLs. No raw card data ever touches your code.
6
6
  triggers: [payment, stripe, checkout, charge, subscription, take payments, billing, refund, recurring, sell]
7
- checksum: sha256-bdf124b2a3d32c87676ad34f0a20df134099bcbebe7f9a11f05ceddf74a6b2a9
7
+ checksum: sha256-742d42da2441fb3ce1317b503dd68f706a1f3d4a7d0f8128473683c26fa3be18
8
8
  ---
9
9
 
10
10
  # MyPaymentsAPI
@@ -82,4 +82,19 @@ myapi payments refund <charge_id>
82
82
  - Multi-currency on a single charge.
83
83
  - Customer object as a first-class resource (Stripe tracks by email; `my-crm-api` has the engagement view).
84
84
 
85
+ ## HTTP (from deployed code)
86
+
87
+ <!-- http:start -->
88
+ <!-- generated by `npm run canonical-sync` — do not edit -->
89
+ ```
90
+ base https://api.myapihq.com
91
+ path POST /payments/orgs/{org_id}/connect
92
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
93
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
94
+ ```
95
+
96
+ - **Per-slot host** — do not assume one host serves every slot.
97
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
98
+ <!-- http:end -->
99
+
85
100
  Run `myapi payments --help` or `myapi payments <subcommand> --help` for full flag reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Contact database backed by the Goldfox crawl. Filter people by Goldfox confidence tier, seniority, email type, country, link confidence, plus rich behavioral company signals (has_c_level, has_careers_page, has_decision_maker, etc.). The targeting layer for outbound campaigns.
6
6
  triggers: [people, contacts, leads, prospects, search, filter, goldfox, decision-makers, c-level, b2b targeting, corporate email]
7
- checksum: sha256-1eb93087638966eee65fb7a88fe37baaa27a01dd5d97c1ef17387b1a36300c0e
7
+ checksum: sha256-e3f793369aebacfedad165f6bfa1ef831cbf17951e18f34110197697149bf416
8
8
  ---
9
9
 
10
10
  # MyPeopleAPI
@@ -104,4 +104,19 @@ myapi audience members $AID --limit 100 --json > targets.json
104
104
  - `keyword` matches the row's **domain**, not name/title. Use `--keyword acme` to find people whose domain contains "acme".
105
105
  - For a persistent target list, use `my-audience-api` (snapshot the filter; re-evaluate on `audience refresh`).
106
106
 
107
+ ## HTTP (from deployed code)
108
+
109
+ <!-- http:start -->
110
+ <!-- generated by `npm run canonical-sync` — do not edit -->
111
+ ```
112
+ base https://api.myapihq.com
113
+ path POST /people/orgs/{org_id}/search
114
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
115
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
116
+ ```
117
+
118
+ - **Per-slot host** — do not assume one host serves every slot.
119
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
120
+ <!-- http:end -->
121
+
107
122
  Run `myapi people --help` for full flag reference.
@@ -4,7 +4,7 @@ version: 1.0.0
4
4
  description: >
5
5
  Tracking pixel + identity resolution for MyAPI funnels and email. Capture visits and events, resolve known users to anonymous sessions, stream interaction events for analytics. Pairs with mycrmapi for auto-ingest of pixel_visit events on known contacts.
6
6
  triggers: [pixel, analytics, tracking, visit, event, identity, session, attribution, geo, open pixel]
7
- checksum: sha256-562f081ef28c0dae01045a4135f9d073d69c50899145e75c6c97fe75b974cb15
7
+ checksum: sha256-2c6508a5fdfa752cc5fd4231c087380e6d904f514973830a34e919b277ad31de
8
8
  ---
9
9
 
10
10
  # MyPixelAPI
@@ -50,9 +50,13 @@ Pixel data lives ~90 days hot; aggregated geo/audience samples persist longer. D
50
50
  | `myapi pixel events (--campaign-id <id> \| --domain <domain>) [--from <iso>] [--to <iso>] [--limit N] [--offset N]` | Engagement events (sent / open / click / page_visit). Requires at least one filter: `--campaign-id` or `--domain` |
51
51
  | `myapi pixel interactions [--website <domain>] [--campaign-id <id>] [--domain <domain>] [--from <iso>] [--to <iso>] [--limit N] [--offset N]` | Unified timeline of visits + events |
52
52
  | `myapi pixel identity <pixel_id> --website <domain>` | Resolve a pixel ID's identity graph (returns `{uuid, is_resolved, nodes, …}`) |
53
+ | `myapi pixel identify <pixel_id> (--email <addr> \| --external-id <id>)` | Attach a known identity to an anonymous visitor — the write half of identity resolution |
53
54
  | `myapi pixel audience` | Geographic distribution sample of your pixel audience |
54
55
  <!-- generated:end -->
55
56
 
57
+ `identity` reads the graph; `identify` writes to it. Everything else in this
58
+ slot is read-only.
59
+
56
60
  ## Examples
57
61
  <!-- llm:start -->
58
62
  ```bash
@@ -94,8 +98,27 @@ visitor:
94
98
  Pass either or both. After this, `pixel identity <pixel_id>` resolves the
95
99
  graph across the visitor's sessions.
96
100
 
101
+ ## HTTP (from deployed code)
102
+
103
+ <!-- http:start -->
104
+ <!-- generated by `npm run canonical-sync` — do not edit -->
105
+ ```
106
+ base https://api.mypixelapi.com
107
+ path POST /pixel/orgs/{org_id}/identify
108
+ auth Authorization: Bearer <key> (fn: env.__MYAPI_KEY · container: env.MYAPI_KEY)
109
+ reply { "success": true, "data": …, "error": null, "meta": {…} }
110
+ ```
111
+
112
+ - **Per-slot host** — do not assume one host serves every slot.
113
+ - **Org id goes in the PATH** — there is no `X-Org-Id` header.
114
+ <!-- http:end -->
115
+
97
116
  Run `myapi pixel --help` for inline reference.
98
117
 
99
- ## Status
118
+ ## Maturity
100
119
 
101
- **Backend reads are GA; agent-facing skill content is draft.** This skill publishes (status flips from `planned` to `ga` in `services.ts`) once pixel → CRM auto-ingest is wired so the cross-primitive examples above resolve end-to-end.
120
+ Reads are live and the CLI surface is stable. The slot is `preview` for one
121
+ reason: **pixel → CRM auto-ingest is not wired yet**, so a `pixel_visit` does
122
+ not appear on a contact's CRM timeline today. Every read verb works; the
123
+ cross-primitive examples that join pixel data to CRM contacts do not resolve
124
+ end-to-end until that lands.