@myapihq/cli 2.16.3 → 2.17.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.
- package/dist/commands/container.js +66 -0
- package/dist/sdk-container.test.js +5 -1
- package/dist/skills/my-api-hq/SKILL.md +13 -11
- package/dist/skills/my-container-api/SKILL.md +14 -9
- package/dist/skills/my-crm-api/SKILL.md +10 -10
- package/dist/skills/my-email-api/SKILL.md +19 -3
- package/package.json +2 -2
|
@@ -11,6 +11,7 @@ export const EXPOSES = [
|
|
|
11
11
|
'GET /container/orgs/{org_id}/containers',
|
|
12
12
|
'GET /container/orgs/{org_id}/containers/{id}',
|
|
13
13
|
'DELETE /container/orgs/{org_id}/containers/{id}',
|
|
14
|
+
'PATCH /container/orgs/{org_id}/containers/{id}',
|
|
14
15
|
'POST /container/orgs/{org_id}/containers/{id}/deploy',
|
|
15
16
|
'GET /container/orgs/{org_id}/containers/{id}/logs',
|
|
16
17
|
'GET /container/orgs/{org_id}/containers/{id}/revisions',
|
|
@@ -28,6 +29,7 @@ export const SCHEMA = {
|
|
|
28
29
|
'max-instances': 'number',
|
|
29
30
|
port: 'number',
|
|
30
31
|
env: 'string',
|
|
32
|
+
unset: 'string',
|
|
31
33
|
tail: 'number',
|
|
32
34
|
scope: 'string',
|
|
33
35
|
'no-promote': 'boolean',
|
|
@@ -587,6 +589,18 @@ Examples:
|
|
|
587
589
|
myapi container create --name api --port 8080
|
|
588
590
|
myapi container create --name nightly --type job --cron "0 3 * * *"
|
|
589
591
|
myapi container create --name queue-worker --type worker --memory 1Gi`,
|
|
592
|
+
'env': `myapi container env <id> --env KEY=VALUE[,K2=V2] [--unset KEY3[,KEY4]] [--org <id>] [--json]
|
|
593
|
+
|
|
594
|
+
Change environment variables on a container that already exists, and roll a new
|
|
595
|
+
revision on the SAME image so they take effect. No rebuild, and the container
|
|
596
|
+
keeps its URL, its scoped key and its custom domain.
|
|
597
|
+
|
|
598
|
+
This is a MERGE. Variables you do not name keep their values, so adding one
|
|
599
|
+
entry to an allowlist does not mean resending every secret. --unset removes.
|
|
600
|
+
|
|
601
|
+
Examples:
|
|
602
|
+
myapi container env c-123 --env ALLOWED=a@x.com,b@y.com
|
|
603
|
+
myapi container env c-123 --env LOG_LEVEL=debug --unset LEGACY_FLAG`,
|
|
590
604
|
'deploy': `myapi container deploy <id> <image-ref> [--org <id>] [--json]
|
|
591
605
|
myapi container deploy <id> --source <dir|tar.gz> [--org <id>] [--json]
|
|
592
606
|
|
|
@@ -673,6 +687,7 @@ Subcommands:
|
|
|
673
687
|
deploy <id> <image> Ship a pre-built image (or --source <dir|tar> to build) and go live
|
|
674
688
|
(--smoke to verify before promoting; --no-promote to hold it back)
|
|
675
689
|
domain <id> <domain> Bind a custom domain (--remove to unbind)
|
|
690
|
+
env <id> Change environment variables (merge; rolls a new revision)
|
|
676
691
|
get <id> Inspect a container
|
|
677
692
|
list List containers in your org
|
|
678
693
|
logs <id> Show recent runtime logs (--tail <n>, --scope all) — see build-logs for build failures
|
|
@@ -691,8 +706,59 @@ All commands accept --org <id> (or set default: myapi config set-org <id>).`);
|
|
|
691
706
|
info(`Unknown subcommand: ${subcommand}. Run "myapi container --help" for the list.`);
|
|
692
707
|
return;
|
|
693
708
|
}
|
|
709
|
+
/**
|
|
710
|
+
* `myapi container env <id> --env K=V[,K2=V2] [--unset K3[,K4]]`
|
|
711
|
+
*
|
|
712
|
+
* Until 2026-08-19 the only way to change a variable was to delete the
|
|
713
|
+
* container and create another, losing the URL, the scoped key and the custom
|
|
714
|
+
* domain. The skill said to do exactly that, and a customer went through three
|
|
715
|
+
* generations of one container in a week because of it.
|
|
716
|
+
*/
|
|
717
|
+
async function envCmd(id, flags) {
|
|
718
|
+
const config = requireConfig();
|
|
719
|
+
const orgId = requireOrg(flags, config, 'myapi container env <id> --env K=V [--unset K2]');
|
|
720
|
+
if (!id)
|
|
721
|
+
error('Missing id.\nUsage: myapi container env <id> --env KEY=VALUE[,K2=V2] [--unset KEY3[,KEY4]]');
|
|
722
|
+
const env = {};
|
|
723
|
+
if (typeof flags.env === 'string') {
|
|
724
|
+
const parsed = _parseEnv(flags.env);
|
|
725
|
+
if (typeof parsed === 'string')
|
|
726
|
+
error(parsed);
|
|
727
|
+
Object.assign(env, parsed);
|
|
728
|
+
}
|
|
729
|
+
if (typeof flags.unset === 'string') {
|
|
730
|
+
for (const k of flags.unset.split(',').map(s => s.trim()).filter(Boolean))
|
|
731
|
+
env[k] = null;
|
|
732
|
+
}
|
|
733
|
+
if (Object.keys(env).length === 0) {
|
|
734
|
+
error('Nothing to change. Pass --env KEY=VALUE to set one, or --unset KEY to remove one.\n' +
|
|
735
|
+
'This is a merge: variables you do not name keep their values.');
|
|
736
|
+
}
|
|
737
|
+
info('› Updating environment…');
|
|
738
|
+
const res = await sdkContainer.updateContainerEnv(config.api_key, orgId, id, env);
|
|
739
|
+
if (flags.json) {
|
|
740
|
+
printJson(res);
|
|
741
|
+
return;
|
|
742
|
+
}
|
|
743
|
+
if (res.set?.length)
|
|
744
|
+
info(` set: ${res.set.join(', ')}`);
|
|
745
|
+
if (res.removed?.length)
|
|
746
|
+
info(` removed: ${res.removed.join(', ')}`);
|
|
747
|
+
// Say plainly whether the running container has the new values, because
|
|
748
|
+
// "stored" and "live" are different states and only one of them is what the
|
|
749
|
+
// caller asked for.
|
|
750
|
+
if (res.applied) {
|
|
751
|
+
success(`Redeployed on the same image — the new values are live${res.revision ? ` (${res.revision})` : ''}.`);
|
|
752
|
+
}
|
|
753
|
+
else {
|
|
754
|
+
info(' Stored. This container has no deployment yet, so the values apply on your first deploy.');
|
|
755
|
+
}
|
|
756
|
+
if (res.env)
|
|
757
|
+
info(` ${Object.keys(res.env).length} variable(s) now set: ${Object.keys(res.env).sort().join(', ')}`);
|
|
758
|
+
}
|
|
694
759
|
switch (subcommand) {
|
|
695
760
|
case 'create': return create(args[0], flags);
|
|
761
|
+
case 'env': return envCmd(args[0], flags);
|
|
696
762
|
case 'build-logs': return buildLogs(args[0], flags);
|
|
697
763
|
case 'deploy': return deploy(args[0], args[1], flags);
|
|
698
764
|
case 'list': return list(flags);
|
|
@@ -144,12 +144,16 @@ describe('container.getContainerLogs', () => {
|
|
|
144
144
|
});
|
|
145
145
|
});
|
|
146
146
|
describe('container.EXPOSES', () => {
|
|
147
|
-
it('covers the
|
|
147
|
+
it('covers the 12 container endpoints', () => {
|
|
148
148
|
expect(container.EXPOSES).toEqual([
|
|
149
149
|
'POST /container/orgs/{org_id}/containers',
|
|
150
150
|
'GET /container/orgs/{org_id}/containers',
|
|
151
151
|
'GET /container/orgs/{org_id}/containers/{id}',
|
|
152
152
|
'DELETE /container/orgs/{org_id}/containers/{id}',
|
|
153
|
+
// Added 2026-08-19. Env is the one create-time setting that is NOT
|
|
154
|
+
// immutable: PATCH merges the map and rolls a revision on the same
|
|
155
|
+
// image, so the container keeps its URL, scoped key and custom domain.
|
|
156
|
+
'PATCH /container/orgs/{org_id}/containers/{id}',
|
|
153
157
|
'POST /container/orgs/{org_id}/containers/{id}/deploy',
|
|
154
158
|
// Added 2026-07-28. Promote and rollback are ONE endpoint: naming a
|
|
155
159
|
// revision promotes it, omitting one rolls back to the previous ready
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: my-api-hq
|
|
3
|
-
version: 1.2.
|
|
3
|
+
version: 1.2.1
|
|
4
4
|
description: >
|
|
5
5
|
Auth, organizations, and billing hub. Start here to get an api_key and org_id — every other service depends on both.
|
|
6
6
|
triggers: [api key, account, organization, org, billing, balance, topup, credits, setup, defaults, brand, sync brand, doctor, health check, is my org healthy]
|
|
7
|
-
checksum: sha256-
|
|
7
|
+
checksum: sha256-b4eef3d505e92f2b9fe8dfa45b74d4221e3c646947ebfe8961aa5a2445bfa139
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# MyApiHQ
|
|
@@ -34,27 +34,29 @@ An anonymous account can upgrade at any time via `myapi account link <email>`
|
|
|
34
34
|
| Command | What it does |
|
|
35
35
|
|---|---|
|
|
36
36
|
| `myapi account setup` | Interactive setup: creates account, generates api_key, sets defaults |
|
|
37
|
-
| `myapi status` | Single-screen orientation: account + every resource in the default org. Start here when you don't know what
|
|
37
|
+
| `myapi status` | Single-screen orientation: account + every resource in the default org. Start here when you don't know what exists |
|
|
38
38
|
| `myapi account whoami` | Show current account, default org/funnel, balance, free-tier usage |
|
|
39
|
-
| `myapi account link [email]` | Upgrade anonymous account to registered (or add a
|
|
39
|
+
| `myapi account link [email]` | Upgrade anonymous account to registered (or add a session) |
|
|
40
40
|
| `myapi account switch [index]` | Switch active account |
|
|
41
|
+
| `myapi account import-key` | Import an API key non-interactively (CI, Docker) |
|
|
42
|
+
| `myapi account registrant <set\|get\|clear>` | WHOIS contact info `domain register` requires (ICANN) |
|
|
41
43
|
| `myapi org list` | List all orgs (`*` marks the default) |
|
|
42
44
|
| `myapi org create --name "..."` | Create a new org (`--yes` auto-sets as default) |
|
|
43
45
|
| `myapi org get [id]` | Inspect one org (defaults to current default) |
|
|
44
46
|
| `myapi org update [id]` | Update fields (name, tagline, description, business-sector, logo-url) |
|
|
45
|
-
| `myapi org delete <id>` | Delete an org and cascade (funnels included). Verify
|
|
46
|
-
| `myapi org sync-brand <domain>` | Scrape a live site
|
|
47
|
+
| `myapi org delete <id>` | Delete an org and cascade (funnels included). Verify with `myapi org get <id>` first; `--yes` required non-interactively |
|
|
48
|
+
| `myapi org sync-brand <domain>` | Scrape a live site to auto-fill brand info |
|
|
47
49
|
| `myapi keys list / create / revoke <id>` | Manage API keys (alias `myapi account api-keys`) |
|
|
48
50
|
| `myapi billing balance` | Check balance |
|
|
49
51
|
| `myapi billing topup <amount>` | Top up by dollar amount |
|
|
50
52
|
| `myapi billing history` | Recent transactions |
|
|
51
|
-
| `myapi billing usage [--period month|30d]` | Spend rolled up by service (
|
|
52
|
-
| `myapi billing spend-cap [<amount> | clear] [--period month|day]` | Set/show/clear the account-level spend ceiling
|
|
53
|
-
| `myapi billing auto-recharge [show \| set \| disable]` | Keep the wallet funded
|
|
53
|
+
| `myapi billing usage [--period month|30d]` | Spend rolled up by service (month or trailing 30d) |
|
|
54
|
+
| `myapi billing spend-cap [<amount> | clear] [--period month|day]` | Set/show/clear the account-level spend ceiling |
|
|
55
|
+
| `myapi billing auto-recharge [show \| set \| disable]` | Keep the wallet funded — off-session refill when balance drops below a threshold, capped monthly |
|
|
54
56
|
| `myapi account mailing-address ["<address>"]` | Get or set the account's CAN-SPAM mailing address (required for email send) |
|
|
55
57
|
| `myapi config set-org <id>` / `set-funnel <id>` / `set-domain <name>` | Set CLI defaults |
|
|
56
|
-
| `myapi install-skills` | Install agent
|
|
57
|
-
| `myapi doctor [--verbose] [--json]` | Org-wide health check:
|
|
58
|
+
| `myapi install-skills` | Install agent skills into ~/.claude/, ~/.gemini/, ~/.cursor/ |
|
|
59
|
+
| `myapi doctor [--verbose] [--json]` | Org-wide health check: config/integrity findings + DNS/HTTP probes |
|
|
58
60
|
<!-- generated:end -->
|
|
59
61
|
|
|
60
62
|
## Examples
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: my-container-api
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.1.0
|
|
4
4
|
description: >
|
|
5
5
|
Run containers on demand — long-running services, background workers, and scheduled jobs. The heavier-duty sibling of edge functions, for native deps and long execution.
|
|
6
6
|
triggers: [container, cloud run, dynamic app, custom domain app, service, worker, scheduled job, deploy container, docker image]
|
|
7
|
-
checksum: sha256-
|
|
7
|
+
checksum: sha256-0a83428114cbc7065d1a4db4f8a0cf39ff965c51acac78f5eeff159345a08da2
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# MyContainerAPI
|
|
11
11
|
|
|
12
|
-
A container runs a pre-built image on managed cloud infrastructure. Three types: a **service** (HTTP server, scales to zero), a **worker** (always-on background process), or a **job** (runs to completion — the only type that takes a cron schedule).
|
|
12
|
+
A container runs a pre-built image on managed cloud infrastructure. Three types: a **service** (HTTP server, scales to zero), a **worker** (always-on background process), or a **job** (runs to completion — the only type that takes a cron schedule).
|
|
13
13
|
|
|
14
14
|
## Capabilities
|
|
15
15
|
<!-- llm:start -->
|
|
16
16
|
The lifecycle is **create → deploy → (optionally) bind a custom domain**.
|
|
17
17
|
|
|
18
|
-
- `create` registers the container and issues a **scoped API key**, returned once. The
|
|
18
|
+
- `create` registers the container and issues a **scoped API key**, returned once. The container gets it as `MYAPI_KEY`, so your code calls other MyAPI slots with no token handling. Deploy rotates this key.
|
|
19
19
|
- `deploy` takes **either** a pre-built image reference **or** a source
|
|
20
20
|
directory. `--source ./dir` tars the directory, builds it server-side
|
|
21
21
|
(typically ~4 minutes) and deploys the result — **no Docker on your machine,
|
|
@@ -53,12 +53,12 @@ it, so the probe would never reach your container.
|
|
|
53
53
|
|
|
54
54
|
### Custom domains (dynamic apps)
|
|
55
55
|
|
|
56
|
-
`myapi container domain <id> <domain>` binds a custom domain to a **deployed** container,
|
|
56
|
+
`myapi container domain <id> <domain>` binds a custom domain to a **deployed** container, over HTTPS automatically. The path for a dynamic backend on a real domain — unlike `my-funnel-api`, which serves static sites.
|
|
57
57
|
|
|
58
58
|
Get it right:
|
|
59
59
|
|
|
60
60
|
- **Deploy first.** Binding a domain to a container that has never deployed fails (422) — there is nothing running to route to.
|
|
61
|
-
- **Register the parent domain first
|
|
61
|
+
- **Register the parent domain first** via `my-domain-api`. Binding `app.synthesisdaily.com` requires `synthesisdaily.com` registered in MyAPI; otherwise 422.
|
|
62
62
|
- **One domain per container.** Re-binding, or binding a hostname already taken, fails (409).
|
|
63
63
|
- `--remove` unbinds. `myapi container get <id>` shows the bound `custom_domain`.
|
|
64
64
|
<!-- llm:end -->
|
|
@@ -127,8 +127,13 @@ way that looks like an application bug.
|
|
|
127
127
|
- **Any 5xx from your code is replaced by an edge HTML error page.** A JSON
|
|
128
128
|
error envelope will not reach the caller. Return a 4xx if the reason has to
|
|
129
129
|
survive.
|
|
130
|
-
- **`--
|
|
131
|
-
|
|
130
|
+
- **`--cpu`, `--memory`, `--max-instances` and `--cron` are set at `create` and
|
|
131
|
+
cannot be changed by `deploy`.** Recreate to change those.
|
|
132
|
+
- **`--env` CAN be changed after create**, with `container env` — a merge
|
|
133
|
+
(`--unset` removes) that rolls a new revision on the same image, keeping the
|
|
134
|
+
URL, the scoped key and the custom domain. Do NOT recreate to edit a variable:
|
|
135
|
+
this page said to for months, and it cost one customer three generations of
|
|
136
|
+
the same container in a week.
|
|
132
137
|
|
|
133
138
|
### Keeping a service warm
|
|
134
139
|
|
|
@@ -167,4 +172,4 @@ reply { "success": true, "data": …, "error": null, "meta": {…} }
|
|
|
167
172
|
|
|
168
173
|
Run `myapi container --help` for the full flag reference.
|
|
169
174
|
|
|
170
|
-
**End-to-end example:** `examples/authenticated-app/` in github.com/myapihq/myapi walks the full seam — hosted login → token verification → per-user KV record → deployed container.
|
|
175
|
+
**End-to-end example:** `examples/authenticated-app/` in github.com/myapihq/myapi walks the full seam — hosted login → token verification → per-user KV record → deployed container.
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: my-crm-api
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.1
|
|
4
4
|
description: >
|
|
5
5
|
The canonical store of engaged contacts + companies for an org. Auto-ingests from inbound webhooks via a configurable dot-path. Fixed lifecycle_stage enum (cold | warm | qualified | customer | churned). Append-only event timeline with reserved kinds. Soft delete + restore. Promote-from-Goldfox closes the discovery → engagement loop.
|
|
6
6
|
triggers: [crm, contact, company, lead, engagement, pipeline, lifecycle, qualified, customer, webhook ingest, promote]
|
|
7
|
-
checksum: sha256-
|
|
7
|
+
checksum: sha256-285ad94b1266588d103119ec139f11f0d19831bcbfd12779130f9fbeaf7f33f5
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# MyCRMAPI
|
|
11
11
|
|
|
12
|
-
The store that closes the funnel.
|
|
12
|
+
The store that closes the funnel. Without CRM the loop ends nowhere: discover people (Goldfox) → audience → email → pixel → form-fill via webhook → … nothing. People who *engage* live nowhere. CRM is where they land.
|
|
13
13
|
|
|
14
14
|
## Capabilities
|
|
15
15
|
<!-- llm:start -->
|
|
@@ -55,7 +55,7 @@ Agents cannot write events directly — the closed enum is intentional. For cust
|
|
|
55
55
|
### Auto-ingest
|
|
56
56
|
|
|
57
57
|
Today (v1):
|
|
58
|
-
- **Webhook**:
|
|
58
|
+
- **Webhook**: set per endpoint via `crm_email_path`, a JSON dot-path. Default `"email"` ingests `{"email":"x@y.com"}`. For Stripe, set `data.object.customer_email`; for GitHub, `sender.email`. Empty string disables ingest.
|
|
59
59
|
|
|
60
60
|
Coming next (backend wiring in progress):
|
|
61
61
|
- **Email**: every `myapi email message send` writes `email_sent`; opens/clicks fire `email_opened`/`email_clicked`
|
|
@@ -63,19 +63,19 @@ Coming next (backend wiring in progress):
|
|
|
63
63
|
|
|
64
64
|
If a contact doesn't exist for the matched email, it's auto-created with `source=` matching the originating service. The contact's company is auto-linked by email domain (creates the company on first sight).
|
|
65
65
|
|
|
66
|
-
**Missing lead? Check `myapi webhook deliveries` before concluding it never arrived.** A deadlock under concurrent ingest could drop the contact *after* the form returned success
|
|
66
|
+
**Missing lead? Check `myapi webhook deliveries` before concluding it never arrived.** A deadlock under concurrent ingest could drop the contact *after* the form returned success (fixed 2026-07-27). Raw payloads are always stored, so the delivery is there even when the contact isn't.
|
|
67
67
|
|
|
68
68
|
### Soft delete + restore
|
|
69
69
|
|
|
70
|
-
`myapi crm contacts delete <id>` sets `deleted_at` but **
|
|
70
|
+
`myapi crm contacts delete <id>` sets `deleted_at` but **keeps the event timeline**. By default soft-deleted contacts are excluded from search — pass `--include-deleted` to see them. Restore with `myapi crm contacts restore <id>`.
|
|
71
71
|
|
|
72
72
|
### Goldfox enrichment (deferred)
|
|
73
73
|
|
|
74
|
-
A contact promoted from Goldfox carries a `goldfox_person_id`. In v2 the GET response will
|
|
74
|
+
A contact promoted from Goldfox carries a `goldfox_person_id`. In v2 the GET response will embed the row as `goldfox_person`; today it is null. Goldfox-only fields are not yet searchable.
|
|
75
75
|
|
|
76
76
|
### Search filter — re-engagement semantics
|
|
77
77
|
|
|
78
|
-
`--max-last-engagement-days N` returns contacts last engaged *more than* N days ago, and intentionally **includes contacts with no engagement at all** (promoted-but-never-emailed Goldfox leads) — the natural targets of a re-engagement campaign. To separate "never tried" from "tried and went cold," layer `--origin goldfox
|
|
78
|
+
`--max-last-engagement-days N` returns contacts last engaged *more than* N days ago, and intentionally **includes contacts with no engagement at all** (promoted-but-never-emailed Goldfox leads) — the natural targets of a re-engagement campaign. `--min-last-engagement-days N` is its complement: engaged *within* N days. `--company-id <id>` narrows to one company. To separate "never tried" from "tried and went cold," layer `--origin goldfox`.
|
|
79
79
|
|
|
80
80
|
### Failure modes
|
|
81
81
|
|
|
@@ -98,13 +98,13 @@ A contact promoted from Goldfox carries a `goldfox_person_id`. In v2 the GET res
|
|
|
98
98
|
| `myapi crm contacts update <id> [--stage ...] [...]` | Patch fields. Stage change emits `stage_changed` event |
|
|
99
99
|
| `myapi crm contacts delete <id>` | Soft delete (events retained) |
|
|
100
100
|
| `myapi crm contacts restore <id>` | Restore a soft-deleted contact |
|
|
101
|
-
| `myapi crm contacts promote <goldfox_person_id>` | Idempotent Goldfox → CRM
|
|
101
|
+
| `myapi crm contacts promote <goldfox_person_id>` | Idempotent Goldfox → CRM promote |
|
|
102
102
|
| `myapi crm contacts events <id> [--kind ...]` | Timeline (newest first), filter by kind |
|
|
103
103
|
|
|
104
104
|
### Companies
|
|
105
105
|
| Command | What it does |
|
|
106
106
|
|---|---|
|
|
107
|
-
| `myapi crm companies list / search / create / get / update / delete / restore` | Same shape as contacts |
|
|
107
|
+
| `myapi crm companies list / search / create / get / update / delete / restore` | Same shape as contacts. `--domain` filters search, `--name` sets display name |
|
|
108
108
|
| `myapi crm companies promote <domain>` | Goldfox company id IS its domain — pass the domain |
|
|
109
109
|
|
|
110
110
|
<!-- generated:end -->
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: my-email-api
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.1
|
|
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-
|
|
7
|
+
checksum: sha256-18f539fc12dd9e9e8f2abecf518aa1ee70741f85cc26ba0a6a941b9c29d537d8
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# MyEmailAPI
|
|
@@ -24,7 +24,7 @@ A registered domain via **mydomainapi** is the prerequisite — mailboxes need a
|
|
|
24
24
|
<!-- generated:start -->
|
|
25
25
|
| Namespace | Subcommands | Purpose |
|
|
26
26
|
|---|---|---|
|
|
27
|
-
| `email mailbox` | `create`, `list`, `activate-sending` | Create and manage mailboxes |
|
|
27
|
+
| `email mailbox` | `create`, `list`, `delete`, `activate-sending`, `set-forwarding`, `clear-forwarding` | Create and manage mailboxes |
|
|
28
28
|
| `email message` | `send`, `status`, `sent`, `inbox`, `outbox`, `get` | Transactional send + read |
|
|
29
29
|
| `email warmup` | `start`, `stats`, `pause`, `resume`, `stop` | IP/domain warmup for sending reputation |
|
|
30
30
|
| `email template` | `generate`, `list`, `get`, `preview`, `edit`, `send-test`, `delete` | AI-generated HTML templates |
|
|
@@ -60,6 +60,22 @@ myapi email warmup stats --address hello@yourdomain.com
|
|
|
60
60
|
```
|
|
61
61
|
<!-- llm:end -->
|
|
62
62
|
|
|
63
|
+
## Flags worth knowing
|
|
64
|
+
|
|
65
|
+
| Flag | Where | What it does |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| `--username` + `--domain` | `mailbox create` | Alternative to the positional `<user@domain>` |
|
|
68
|
+
| `--filter unassigned` | `mailbox list` | Orphaned mailboxes — those whose domain is gone |
|
|
69
|
+
| `--html` | `message send` | Send an HTML body instead of `--body` plain text |
|
|
70
|
+
| `--template-id` + `--template-vars` | `message send` | Send a stored template with a JSON var map, instead of a body |
|
|
71
|
+
| `--name` | `template generate` | Alternative to the positional `<name>` |
|
|
72
|
+
| `--per-day` | `warmup start` | Cap the daily volume the ramp climbs to |
|
|
73
|
+
| `--emails`, `--quick` | `verify bulk` | Addresses inline rather than on stdin; skip the catch-all probe |
|
|
74
|
+
|
|
75
|
+
Forwarding keeps the original: `set-forwarding <user@domain> <forward-to@domain>`
|
|
76
|
+
copies every inbound message to an external address and leaves it in the mailbox.
|
|
77
|
+
`clear-forwarding <user@domain>` stops it.
|
|
78
|
+
|
|
63
79
|
## Notes
|
|
64
80
|
|
|
65
81
|
- A mailbox is uniquely identified by its address (`username@domain`).
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@myapihq/cli",
|
|
3
3
|
"license": "Apache-2.0",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.17.0",
|
|
5
5
|
"description": "MyAPI command-line interface",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"lint:skills:strict": "node scripts/copy-skills.js && node scripts/lint-skills.js --strict"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@myapihq/sdk": "^2.
|
|
49
|
+
"@myapihq/sdk": "^2.17.0"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/node": "^25.6.0",
|