{"_id":"@medalsocial/sdk","_rev":"22-2db83f64f08f55b90bb9720c2fdd0460","name":"@medalsocial/sdk","dist-tags":{"latest":"1.11.0"},"versions":{"0.1.1":{"name":"@medalsocial/sdk","version":"0.1.1","keywords":["medal","social","sdk","api","typescript","client"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"MIT","_id":"@medalsocial/sdk@0.1.1","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial/issues"},"dist":{"shasum":"a1cd3118bfbabb0c157ca0592c681d656b1498c5","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-0.1.1.tgz","fileCount":9,"integrity":"sha512-bjfLXaXArT+6Lv0LSFM3G0yPIZWCcajzP6qDG/gsb7AhII89YF/1WCBmLDxvN9RFL19mE2Iw4/zVqnfGQFJ+IQ==","signatures":[{"sig":"MEUCIQDeum/mmAcHrO4RuqtmgGOXfKA/yj2qH+y+PRMMt47ruQIgYGFqpsQXihAsHHUP0wYFEjja9FqC2qaTjJk+7wT9sP4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39272},"main":"dist/index.js","_from":"file:medalsocial-sdk-0.1.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"tsup src/index.ts --dts --format esm,cjs --sourcemap","clean":"rm -rf dist","format":"biome format .","test:watch":"vitest"},"_npmUser":{"name":"alioftech","email":"ali@medalsocial.com"},"_resolved":"/private/var/folders/7q/zbt1mr6559s1bwbgxd37wyg00000gn/T/62d8cb0e6eaff9a1abd711e677d7f497/medalsocial-sdk-0.1.1.tgz","_integrity":"sha512-bjfLXaXArT+6Lv0LSFM3G0yPIZWCcajzP6qDG/gsb7AhII89YF/1WCBmLDxvN9RFL19mE2Iw4/zVqnfGQFJ+IQ==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial.git","type":"git"},"_npmVersion":"10.9.2","description":"TypeScript client for Medal Social API (create leads, notes, cookie consents, event signups)","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.0","husky":"^9.1.6","vitest":"^2.0.5","typedoc":"^0.26.6","typescript":"^5.5.4","@types/node":"^24.3.2","@biomejs/biome":"^1.8.3","@commitlint/cli":"^19.4.0","@vitest/coverage-v8":"^2.0.5","@commitlint/config-conventional":"^19.4.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.1_1757713981298_0.058618623623987176","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@medalsocial/sdk","version":"0.1.2","keywords":["medal","social","sdk","api","typescript","client"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"MIT","_id":"@medalsocial/sdk@0.1.2","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial/issues"},"dist":{"shasum":"2c541b6b34b036878e5dd1e87d3d416b612e438e","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-0.1.2.tgz","fileCount":9,"integrity":"sha512-2IG64CxnUhaNOudwf3uJgP7acnkeGsi62ZTfxeAnUIjF+S8qAWoWVhIqLgABUWRj9JwatureC8h3Nmh9itCH5Q==","signatures":[{"sig":"MEUCIC2vKn2ZvL2AB3oD9TnADm6drJp/Y+kP0TfmSkvBkEFJAiEAo6MQad7QQoSSmWdnDOPo4Ae56Ic8+xhAZEGDyFEpW3I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39272},"main":"dist/index.js","_from":"file:medalsocial-sdk-0.1.2.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"tsup src/index.ts --dts --format esm,cjs --sourcemap","clean":"rm -rf dist","format":"biome format .","test:watch":"vitest"},"_npmUser":{"name":"alioftech","email":"ali@medalsocial.com"},"_resolved":"/private/var/folders/7q/zbt1mr6559s1bwbgxd37wyg00000gn/T/a14d06fd91e603de9ff02526e480de7c/medalsocial-sdk-0.1.2.tgz","_integrity":"sha512-2IG64CxnUhaNOudwf3uJgP7acnkeGsi62ZTfxeAnUIjF+S8qAWoWVhIqLgABUWRj9JwatureC8h3Nmh9itCH5Q==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial.git","type":"git"},"_npmVersion":"10.9.2","description":"TypeScript client for Medal Social API (create leads, notes, cookie consents, event signups)","directories":{},"sideEffects":false,"_nodeVersion":"22.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.0","husky":"^9.1.6","vitest":"^2.0.5","typedoc":"^0.26.6","typescript":"^5.5.4","@types/node":"^24.3.2","@biomejs/biome":"^1.8.3","@commitlint/cli":"^19.4.0","@vitest/coverage-v8":"^2.0.5","@commitlint/config-conventional":"^19.4.0"},"_npmOperationalInternal":{"tmp":"tmp/sdk_0.1.2_1757714149421_0.9981108666192777","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@medalsocial/sdk","version":"1.0.0","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"MIT","_id":"@medalsocial/sdk@1.0.0","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial/issues"},"dist":{"shasum":"409f8b1511c0b4255a058d71b9bb5bcee15cc0be","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.0.0.tgz","fileCount":10,"integrity":"sha512-0EHPZBxGlnEZZj1qt68q0Y+fST9xMQcqPx+S+cOOyCUtSaweLLe266rkK92Zzr5VDXRLdYhwL2QUKd04/RHNfg==","signatures":[{"sig":"MEYCIQDStBE2nwTIAvosbB8xhq8OD9UyUCdSd+Eiot4Ek3IgRQIhAO8Lh36R5tUf3UEzq6zU6Uldd/ZtK7RFpRRi2QMdlkQT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":129857},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"f9c27c998798dd8f5b680d0be53ea2b812961484","scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"tsup src/index.ts --dts --format esm,cjs --sourcemap","clean":"rm -rf dist","test:watch":"vitest","prepublishOnly":"pnpm test && pnpm build"},"_npmUser":{"name":"alioftech","email":"ali@medalsocial.com"},"repository":{"url":"git+https://github.com/Medal-Social/MedalSocial.git","type":"git"},"_npmVersion":"10.9.7","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, and GDPR compliance","directories":{},"sideEffects":false,"_nodeVersion":"24.11.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.0","vitest":"^2.0.5","typedoc":"^0.26.6","typescript":"^5.5.4","@types/node":"^24.3.2","@biomejs/biome":"^1.8.3","@vitest/coverage-v8":"^2.0.5"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.0.0_1775192204583_0.6454228630130368","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@medalsocial/sdk","version":"1.1.1","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.1.1","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"ab192e3c3b9ffa27ea539339bd09b45cf545b074","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.1.1.tgz","fileCount":15,"integrity":"sha512-pcNh6obwFk9rqGnh6fW0wKaPNAE8iQr9DbA84pg+y27G2TkeGE74Vc/0FSjCIilVVb+mUy7rGv12wkHnyE5ndg==","signatures":[{"sig":"MEUCIQCYfyTYK/OoqQWHtXE3ZNrPObx+PKkYo/v6/DSyUThaQgIgfJ2tQM3NuWmY4OfOeWsO6Brhb9PJd/dupptV+hJV3kU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":191086},"main":"dist/index.js","_from":"file:medalsocial-sdk-1.1.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"tsup src/index.ts pilot/index.ts --dts --format esm,cjs --sourcemap","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && changeset publish && pnpm exec jsr publish","version":"changeset version","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/5b1e618311733fe54361323643fa43f3/medalsocial-sdk-1.1.1.tgz","_integrity":"sha512-pcNh6obwFk9rqGnh6fW0wKaPNAE8iQr9DbA84pg+y27G2TkeGE74Vc/0FSjCIilVVb+mUy7rGv12wkHnyE5ndg==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.11.0","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, and GDPR compliance","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.4","knip":"^5.63.1","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^2.0.5","typedoc":"^0.26.6","only-allow":"^1.2.1","secretlint":"^9.3.2","typescript":"^5.5.4","@types/node":"^24.3.2","lint-staged":"^16.2.6","@biomejs/biome":"^1.8.3","@changesets/cli":"^2.31.0","@commitlint/cli":"^19.4.0","@vitest/coverage-v8":"^2.0.5","@changesets/changelog-github":"^0.6.0","@commitlint/config-conventional":"^19.4.0","@secretlint/secretlint-rule-preset-recommend":"^9.3.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.1_1776772668777_0.32444958961866766","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@medalsocial/sdk","version":"1.1.2","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.1.2","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"e0cbe10908204894c2b9e3ad4542a991a9eacf93","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.1.2.tgz","fileCount":15,"integrity":"sha512-qneGwF7nF2oXe8DnPtQbLNhfJdwTOyMq2Yp07T1XgmtbssJozEde5ukKb0mJew07hcOw8LsZfr4PKyyzs0FVIw==","signatures":[{"sig":"MEUCIQDvOkakQNuWafl+az46xrzINFC7Zsvv8jA3tqkXj5KVAgIgQBJ34+FRSjDb9fTtpV+ilI4Nh+F/0PmgvJ++SHc6V6g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":191324},"main":"dist/index.js","_from":"file:medalsocial-sdk-1.1.2.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"tsup src/index.ts pilot/index.ts --dts --format esm,cjs --sourcemap","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/c34b4a6a4d5a3af7b8589ac8d423f67d/medalsocial-sdk-1.1.2.tgz","_integrity":"sha512-qneGwF7nF2oXe8DnPtQbLNhfJdwTOyMq2Yp07T1XgmtbssJozEde5ukKb0mJew07hcOw8LsZfr4PKyyzs0FVIw==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.11.0","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, and GDPR compliance","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.4","knip":"^5.63.1","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^2.0.5","typedoc":"^0.26.6","only-allow":"^1.2.1","secretlint":"^9.3.2","typescript":"^5.5.4","@types/node":"^24.3.2","lint-staged":"^16.2.6","@biomejs/biome":"^1.8.3","@changesets/cli":"^2.31.0","@commitlint/cli":"^19.4.0","@vitest/coverage-v8":"^2.0.5","@changesets/changelog-github":"^0.6.0","@commitlint/config-conventional":"^19.4.0","@secretlint/secretlint-rule-preset-recommend":"^9.3.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.2_1776773276025_0.7229174102574947","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@medalsocial/sdk","version":"1.1.3","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.1.3","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"bb7b7938b7b4ad429b252e2e866afb09dc294811","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.1.3.tgz","fileCount":15,"integrity":"sha512-i2fylhJlLyPo2YnQJ6COr70rdesAG/RzqrT4LNaJD3hnGDpl2gyyCJGRpKWbcR9RuDGFrGjwuwO7Y3/jq6wHIg==","signatures":[{"sig":"MEQCIAGrelaPUidL7P6GAkE+6+H49F63zQxwgdAXGx9J7N58AiBSb6MOZHNEJMHEOFqFHBy2dqnq/JrneQkUu/mrnQQ29Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":191324},"main":"dist/index.js","_from":"file:medalsocial-sdk-1.1.3.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"tsup src/index.ts pilot/index.ts --dts --format esm,cjs --sourcemap","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/f70f0350a99ac47aa0b1219c5c525f8f/medalsocial-sdk-1.1.3.tgz","_integrity":"sha512-i2fylhJlLyPo2YnQJ6COr70rdesAG/RzqrT4LNaJD3hnGDpl2gyyCJGRpKWbcR9RuDGFrGjwuwO7Y3/jq6wHIg==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.11.0","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, and GDPR compliance","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.4","knip":"^5.63.1","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^2.0.5","typedoc":"^0.26.6","only-allow":"^1.2.1","secretlint":"^9.3.2","typescript":"^5.5.4","@types/node":"^24.3.2","lint-staged":"^16.2.6","@biomejs/biome":"^1.8.3","@changesets/cli":"^2.31.0","@commitlint/cli":"^19.4.0","@vitest/coverage-v8":"^2.0.5","@changesets/changelog-github":"^0.6.0","@commitlint/config-conventional":"^19.4.0","@secretlint/secretlint-rule-preset-recommend":"^9.3.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.3_1776774610168_0.39908017313838373","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@medalsocial/sdk","version":"1.1.4","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.1.4","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"fd86aecef0b89b453131069d234aeb5680d8c5d6","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.1.4.tgz","fileCount":15,"integrity":"sha512-ijSspvHIyIjgmxLNLUMZ1Kxcb7H4EHgaUZie3yig+rp515d8tbinwVFKNTnb6sJlRxbUU51+ZNNkQfbl1mzRGQ==","signatures":[{"sig":"MEUCIHismPIZdXkWeNpRFrh/FfuCmjRaMqiuYbmu6I7IFb5KAiEAiWrKE8KPrCjdm4Uk/jasbAF0rZec6jnxyoMLsoUPAkY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":202062},"main":"dist/index.js","_from":"file:medalsocial-sdk-1.1.4.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"tsup src/index.ts pilot/index.ts --dts --format esm,cjs --sourcemap","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/be7106298a28c7be9a1a373f822d4729/medalsocial-sdk-1.1.4.tgz","_integrity":"sha512-ijSspvHIyIjgmxLNLUMZ1Kxcb7H4EHgaUZie3yig+rp515d8tbinwVFKNTnb6sJlRxbUU51+ZNNkQfbl1mzRGQ==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.11.0","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, and GDPR compliance","directories":{},"lint-staged":{"*.{js,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.4","knip":"^5.63.1","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^2.0.5","typedoc":"^0.26.6","only-allow":"^1.2.1","secretlint":"^9.3.2","typescript":"^5.5.4","@types/node":"^24.3.2","lint-staged":"^16.2.6","@biomejs/biome":"^1.8.3","@changesets/cli":"^2.31.0","@commitlint/cli":"^19.4.0","@vitest/coverage-v8":"^2.0.5","@changesets/changelog-github":"^0.6.0","@commitlint/config-conventional":"^19.4.0","@secretlint/secretlint-rule-preset-recommend":"^9.3.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.4_1776777889561_0.9596520379678366","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@medalsocial/sdk","version":"1.1.5","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.1.5","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"26dce1fcffc9e8bad006e01b979879255f4aab46","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.1.5.tgz","fileCount":15,"integrity":"sha512-3LtQIU/4qhCo/POdLK6Xw7qkiNH0tdejHnpKpuAp/eF21sMQBlHUjYOqCIMwsSN2fvXhlt5qqWq+mXP1ie2VaA==","signatures":[{"sig":"MEUCIQCU4JTh92TxMUFabGsUvFnmGaH/9ok0fs7hsLIY22bbogIgSf64ZNrMbDIYj5WQzpYqzD3FPJqx+RanDE05pvZ/pbg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":202176},"main":"dist/src/index.js","_from":"file:medalsocial-sdk-1.1.5.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"tsup src/index.ts pilot/index.ts --dts --format esm,cjs --sourcemap","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","verify:paths":"node scripts/verify-package-paths.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/f8c5e2631ba53dae58dedf5aabecbd77/medalsocial-sdk-1.1.5.tgz","_integrity":"sha512-3LtQIU/4qhCo/POdLK6Xw7qkiNH0tdejHnpKpuAp/eF21sMQBlHUjYOqCIMwsSN2fvXhlt5qqWq+mXP1ie2VaA==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.11.0","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.4","knip":"^5.63.1","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^2.0.5","typedoc":"^0.26.6","only-allow":"^1.2.1","secretlint":"^9.3.2","typescript":"^5.5.4","@types/node":"^24.3.2","lint-staged":"^16.2.6","@biomejs/biome":"^1.8.3","@changesets/cli":"^2.31.0","@commitlint/cli":"^19.4.0","@vitest/coverage-v8":"^2.0.5","@changesets/changelog-github":"^0.6.0","@commitlint/config-conventional":"^19.4.0","@secretlint/secretlint-rule-preset-recommend":"^9.3.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.5_1777817672235_0.02944341968279196","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"@medalsocial/sdk","version":"1.1.6","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.1.6","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"32461d09aa25dd4eac710cc77e1aa2369decdf98","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.1.6.tgz","fileCount":15,"integrity":"sha512-kLYiCJY1PP1TsKSWWvKCXJdCgG/DVI9VU1IuaAiEVlYnoHW270wV9BNJqV/QuOY0nXVsyQAzZB47hJCmK/QcpA==","signatures":[{"sig":"MEUCIQC689Mj8AxRqa20ZXwHmaNI+wHdo+hmPG3MgPaDm6XppQIgXNLKrwMtaTvNltWt7VrdmfCBAMf3yOuu7VRxaeByPr8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":202176},"main":"dist/src/index.js","_from":"file:medalsocial-sdk-1.1.6.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"tsup src/index.ts pilot/index.ts --dts --format esm,cjs --sourcemap","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","verify:paths":"node scripts/verify-package-paths.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/618b5d554a4deb4d965728d4e777f8ef/medalsocial-sdk-1.1.6.tgz","_integrity":"sha512-kLYiCJY1PP1TsKSWWvKCXJdCgG/DVI9VU1IuaAiEVlYnoHW270wV9BNJqV/QuOY0nXVsyQAzZB47hJCmK/QcpA==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.11.0","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.4","knip":"^5.63.1","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^2.0.5","typedoc":"^0.26.6","only-allow":"^1.2.1","secretlint":"^9.3.2","typescript":"^5.5.4","@types/node":"^24.3.2","lint-staged":"^16.2.6","@biomejs/biome":"^1.8.3","@changesets/cli":"^2.31.0","@commitlint/cli":"^19.4.0","@vitest/coverage-v8":"^2.0.5","@changesets/changelog-github":"^0.6.0","@commitlint/config-conventional":"^19.4.0","@secretlint/secretlint-rule-preset-recommend":"^9.3.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.6_1778284877187_0.9656606749981713","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"@medalsocial/sdk","version":"1.1.7","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.1.7","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"c0250c988ba2ea25dbdb0846c532d683f8b63dc7","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.1.7.tgz","fileCount":15,"integrity":"sha512-0qwuUycnrksf1eE+uXeUxDMiwVCPyfUnUS5nseAB2xWRDZlTguDZsNC9MXNRI1n+AplPptgnvmB+r8y86jv7Og==","signatures":[{"sig":"MEYCIQDO53lssmXPlDdQvkG9CEM+kjfoiE6ZXVFZUWVim0l2TAIhALeRy2YMYOPjZFKZXfA+xgQZ9O8o/7+is94yUBjyLOS4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":202470},"main":"dist/src/index.js","_from":"file:medalsocial-sdk-1.1.7.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"tsup src/index.ts pilot/index.ts --dts --format esm,cjs --sourcemap","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","verify:paths":"node scripts/verify-package-paths.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/fc156186e09e638a5a7a9618f254c756/medalsocial-sdk-1.1.7.tgz","_integrity":"sha512-0qwuUycnrksf1eE+uXeUxDMiwVCPyfUnUS5nseAB2xWRDZlTguDZsNC9MXNRI1n+AplPptgnvmB+r8y86jv7Og==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.12.1","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.4","knip":"^5.63.1","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^2.0.5","typedoc":"^0.26.6","only-allow":"^1.2.1","secretlint":"^9.3.2","typescript":"^5.5.4","@types/node":"^24.3.2","lint-staged":"^16.2.6","@biomejs/biome":"^1.8.3","@changesets/cli":"^2.31.0","@commitlint/cli":"^19.4.0","@vitest/coverage-v8":"^2.0.5","@changesets/changelog-github":"^0.6.0","@commitlint/config-conventional":"^19.4.0","@secretlint/secretlint-rule-preset-recommend":"^9.3.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.1.7_1779029755142_0.7071581043726061","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@medalsocial/sdk","version":"1.2.0","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.2.0","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"50f63f73cc1fafeb66b67dfcbcdae33ecc4d5eab","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.2.0.tgz","fileCount":24,"integrity":"sha512-+IbQ0u6FYGo1K+TDmlTpy6oZyAhNV2HOONjQ5Ivw6G7T69vSV0ZWSkKE3RwMtsCGFBl/GDVUh3oiDoRHRPdbzQ==","signatures":[{"sig":"MEUCIQChFM+NlDD8O+tuRv5B7tH+eytWnZ/CG72NDZwGkBmz5QIgB9LeNj0tIknyWbx30viYYpzl0woKpmRMqNhXVMb0gFo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":495206},"main":"dist/src/index.js","_from":"file:medalsocial-sdk-1.2.0.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"},"./openapi.json":{"default":"./dist/openapi/medal-social.openapi.json"},"./openapi.yaml":"./openapi/medal-social.openapi.yaml","./openapi-types":{"types":"./dist/src/openapi.generated.d.ts","import":"./dist/src/openapi.generated.mjs","require":"./dist/src/openapi.generated.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"pnpm openapi:types && tsup src/index.ts src/openapi.generated.ts pilot/index.ts --dts --format esm,cjs --sourcemap && pnpm openapi:bundle","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","openapi:lint":"redocly lint openapi/medal-social.openapi.yaml","verify:paths":"node scripts/verify-package-paths.mjs","openapi:check":"pnpm openapi:lint && pnpm openapi:types && pnpm openapi:bundle && pnpm openapi:coverage","openapi:types":"openapi-typescript && biome format --write src/openapi.generated.ts","openapi:bundle":"node -e \"require('node:fs').mkdirSync('dist/openapi',{recursive:true})\" && redocly bundle openapi/medal-social.openapi.yaml --output dist/openapi/medal-social.openapi.json","openapi:coverage":"node scripts/assert-openapi-sdk-coverage.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/6155f91bbfa5665bd52250432bde3ebb/medalsocial-sdk-1.2.0.tgz","_integrity":"sha512-+IbQ0u6FYGo1K+TDmlTpy6oZyAhNV2HOONjQ5Ivw6G7T69vSV0ZWSkKE3RwMtsCGFBl/GDVUh3oiDoRHRPdbzQ==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.12.1","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.4","knip":"^5.63.1","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^2.0.5","typedoc":"^0.26.6","only-allow":"^1.2.1","secretlint":"^9.3.2","typescript":"^5.5.4","@types/node":"^24.3.2","lint-staged":"^16.2.6","@redocly/cli":"^2.31.4","@biomejs/biome":"^1.8.3","@changesets/cli":"^2.31.0","@commitlint/cli":"^19.4.0","openapi-typescript":"^7.13.0","@vitest/coverage-v8":"^2.0.5","@changesets/changelog-github":"^0.6.0","@commitlint/config-conventional":"^19.4.0","@secretlint/secretlint-rule-preset-recommend":"^9.3.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.2.0_1779617394037_0.39837072354762504","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@medalsocial/sdk","version":"1.2.1","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media","tanstack-intent"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.2.1","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"4790a4cf28d3d9f22371c91dbe100ac13c2aa276","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.2.1.tgz","fileCount":26,"integrity":"sha512-gscHR9b9aR9ASudQlSZtAnUX0Sx4C5hPHaMjONhxH48dEglPF0zJC1qMJwLjxpgjKZrmiCV64iwVD5i8aA/Xgg==","signatures":[{"sig":"MEYCIQDbGB4zxthQ4PmgOgNveDnNnVAxCzhUnVHtMnwS7ZBSiwIhAPeaIUFCr5MsAAzYKfM8V4RdsthKDaWoarXrpusk5YwJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":510678},"main":"dist/src/index.js","_from":"file:medalsocial-sdk-1.2.1.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"},"./openapi.json":{"default":"./dist/openapi/medal-social.openapi.json"},"./openapi.yaml":"./openapi/medal-social.openapi.yaml","./openapi-types":{"types":"./dist/src/openapi.generated.d.ts","import":"./dist/src/openapi.generated.mjs","require":"./dist/src/openapi.generated.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"pnpm openapi:types && tsup src/index.ts src/openapi.generated.ts pilot/index.ts --dts --format esm,cjs --sourcemap && pnpm openapi:bundle","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","openapi:lint":"redocly lint openapi/medal-social.openapi.yaml","verify:paths":"node scripts/verify-package-paths.mjs","openapi:check":"pnpm openapi:lint && pnpm openapi:types && pnpm openapi:bundle && pnpm openapi:coverage","openapi:types":"openapi-typescript && biome format --write src/openapi.generated.ts","openapi:bundle":"node -e \"require('node:fs').mkdirSync('dist/openapi',{recursive:true})\" && redocly bundle openapi/medal-social.openapi.yaml --output dist/openapi/medal-social.openapi.json","openapi:coverage":"node scripts/assert-openapi-sdk-coverage.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/a78cdc434983b355777596770504e511/medalsocial-sdk-1.2.1.tgz","_integrity":"sha512-gscHR9b9aR9ASudQlSZtAnUX0Sx4C5hPHaMjONhxH48dEglPF0zJC1qMJwLjxpgjKZrmiCV64iwVD5i8aA/Xgg==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.12.1","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.15.0","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.13.4","knip":"^5.63.1","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^2.0.5","typedoc":"^0.26.6","only-allow":"^1.2.1","secretlint":"^9.3.2","typescript":"^5.5.4","@types/node":"^24.3.2","lint-staged":"^16.2.6","@redocly/cli":"^2.31.4","@biomejs/biome":"^1.8.3","@changesets/cli":"^2.31.0","@commitlint/cli":"^19.4.0","@tanstack/intent":"0.0.41","openapi-typescript":"^7.13.0","@vitest/coverage-v8":"^2.0.5","@changesets/changelog-github":"^0.6.0","@commitlint/config-conventional":"^19.4.0","@secretlint/secretlint-rule-preset-recommend":"^9.3.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.2.1_1779737360650_0.5594670323203828","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@medalsocial/sdk","version":"1.3.0","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media","tanstack-intent"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.3.0","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"6770a7bb1e06847bb2bb91e3e7806e6651e9d97e","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.3.0.tgz","fileCount":26,"integrity":"sha512-zqeHjOPlNYnhC6H7LmPQd2ENMDD0n7xF+IXM3/v3s3NRRUBIjRKYBFrNi0SrL3YH1CoURcymmZyjh8o58rgpqQ==","signatures":[{"sig":"MEUCIA+nKd9kjkz+zSx0Ak2B8BP/cw1QIUssl+ihY424T8YRAiEAjLqa6NcX+Opg23vz4DJ9VgpnRE/9Y1jU0gtJvTq7B7c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":736178},"main":"dist/src/index.js","_from":"file:medalsocial-sdk-1.3.0.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"},"./openapi.json":{"default":"./dist/openapi/medal-social.openapi.json"},"./openapi.yaml":"./openapi/medal-social.openapi.yaml","./openapi-types":{"types":"./dist/src/openapi.generated.d.ts","import":"./dist/src/openapi.generated.mjs","require":"./dist/src/openapi.generated.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"pnpm openapi:types && tsup src/index.ts src/openapi.generated.ts pilot/index.ts --dts --format esm,cjs --sourcemap && pnpm openapi:bundle","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","openapi:lint":"redocly lint openapi/medal-social.openapi.yaml","verify:paths":"node scripts/verify-package-paths.mjs","openapi:check":"pnpm openapi:lint && pnpm openapi:types && pnpm openapi:bundle && pnpm openapi:coverage","openapi:types":"openapi-typescript && biome format --write src/openapi.generated.ts","openapi:bundle":"node -e \"require('node:fs').mkdirSync('dist/openapi',{recursive:true})\" && redocly bundle openapi/medal-social.openapi.yaml --output dist/openapi/medal-social.openapi.json","openapi:coverage":"node scripts/assert-openapi-sdk-coverage.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/e0318956bbc4c8852884cd9a81ccdb8a/medalsocial-sdk-1.3.0.tgz","_integrity":"sha512-zqeHjOPlNYnhC6H7LmPQd2ENMDD0n7xF+IXM3/v3s3NRRUBIjRKYBFrNi0SrL3YH1CoURcymmZyjh8o58rgpqQ==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.16.0","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, helpdesk, webhooks, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.23.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.14.3","knip":"^5.63.1","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^4.1.10","typedoc":"^0.28.20","only-allow":"^1.2.1","secretlint":"^13.0.2","typescript":"^5.5.4","@types/node":"^24.3.2","lint-staged":"^17.0.8","@redocly/cli":"^2.37.0","@biomejs/biome":"^1.8.3","@changesets/cli":"^2.31.0","@commitlint/cli":"^21.2.0","@tanstack/intent":"0.3.5","openapi-typescript":"^7.13.0","@vitest/coverage-v8":"^4.1.10","@changesets/changelog-github":"^0.7.0","@commitlint/config-conventional":"^21.2.0","@secretlint/secretlint-rule-preset-recommend":"^13.0.2"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.3.0_1783385890755_0.8780907917808742","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@medalsocial/sdk","version":"1.4.0","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media","tanstack-intent"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.4.0","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"1e523293255d409d05697ea1a41fe285bb0370fe","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.4.0.tgz","fileCount":26,"integrity":"sha512-dvhzrMoGnW3YKoGFSwP4SmyE18WC4KsmOlhFdq6+rRBZoJ2Y+8LRUM++4UFhG854r6dI0XygGwZ/6J2xVtCKdg==","signatures":[{"sig":"MEUCIAvhVJlgX9Zd0GgV0X+5SghXQhTwzhlvETjhFGX28Xm3AiEA86ZkO8YFqENhbXNOGNG4JNrfJEyq5QHiMX+n+pB2AGg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":728365},"main":"dist/src/index.js","_from":"file:medalsocial-sdk-1.4.0.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"},"./openapi.json":{"default":"./dist/openapi/medal-social.openapi.json"},"./openapi.yaml":"./openapi/medal-social.openapi.yaml","./openapi-types":{"types":"./dist/src/openapi.generated.d.ts","import":"./dist/src/openapi.generated.mjs","require":"./dist/src/openapi.generated.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"pnpm openapi:types && tsup && pnpm openapi:bundle","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","openapi:lint":"redocly lint openapi/medal-social.openapi.yaml","verify:paths":"node scripts/verify-package-paths.mjs","openapi:check":"pnpm openapi:lint && pnpm openapi:types && pnpm openapi:bundle && pnpm openapi:coverage","openapi:types":"openapi-typescript && biome format --write src/openapi.generated.ts","openapi:bundle":"node -e \"require('node:fs').mkdirSync('dist/openapi',{recursive:true})\" && redocly bundle openapi/medal-social.openapi.yaml --output dist/openapi/medal-social.openapi.json","openapi:coverage":"node scripts/assert-openapi-sdk-coverage.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/1cad1ad797914e9fb4ad287edc2d2e3e/medalsocial-sdk-1.4.0.tgz","_integrity":"sha512-dvhzrMoGnW3YKoGFSwP4SmyE18WC4KsmOlhFdq6+rRBZoJ2Y+8LRUM++4UFhG854r6dI0XygGwZ/6J2xVtCKdg==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.16.0","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, helpdesk, webhooks, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.14.3","knip":"^6.29.0","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^4.1.10","typedoc":"^0.28.20","only-allow":"^1.2.1","secretlint":"^13.0.4","typescript":"^6.0.3","@types/node":"^24.13.3","lint-staged":"^17.2.0","@redocly/cli":"^2.42.0","@biomejs/biome":"^2.5.6","@changesets/cli":"^2.31.1","@commitlint/cli":"^21.2.1","@tanstack/intent":"0.3.6","openapi-typescript":"^7.13.0","@vitest/coverage-v8":"^4.1.10","@changesets/changelog-github":"^0.7.0","@commitlint/config-conventional":"^21.2.0","@secretlint/secretlint-rule-preset-recommend":"^13.0.4"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.4.0_1785437935259_0.2491119967568205","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@medalsocial/sdk","version":"1.5.0","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media","tanstack-intent"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.5.0","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"f13bc8e2f281e5b655b4295fa875f118096cbb12","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.5.0.tgz","fileCount":26,"integrity":"sha512-dBC3g8D8CWvoCBJTHeCmAXjLpZmlOndB1ZzAMaXb+hQGeY/3KDtaMU2YtE5CxhpEqCjRAbkzf+H54W3RiYsvxw==","signatures":[{"sig":"MEYCIQD+86Pu6BkTewnIG0JgDqfPxecDhhslGlXzA25qeXTF3wIhAMwpZQZWRGmhf70u8ljMFuzfUWVZ5cz30/3dibtPfOKN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":813514},"main":"dist/src/index.js","_from":"file:medalsocial-sdk-1.5.0.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"},"./openapi.json":{"default":"./dist/openapi/medal-social.openapi.json"},"./openapi.yaml":"./openapi/medal-social.openapi.yaml","./openapi-types":{"types":"./dist/src/openapi.generated.d.ts","import":"./dist/src/openapi.generated.mjs","require":"./dist/src/openapi.generated.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"pnpm openapi:types && tsup && pnpm openapi:bundle","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","openapi:lint":"redocly lint openapi/medal-social.openapi.yaml","verify:paths":"node scripts/verify-package-paths.mjs","openapi:check":"pnpm openapi:lint && pnpm openapi:types && pnpm openapi:bundle && pnpm openapi:coverage","openapi:types":"openapi-typescript && biome format --write src/openapi.generated.ts","openapi:bundle":"node -e \"require('node:fs').mkdirSync('dist/openapi',{recursive:true})\" && redocly bundle openapi/medal-social.openapi.yaml --output dist/openapi/medal-social.openapi.json","openapi:coverage":"node scripts/assert-openapi-sdk-coverage.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/1d34fbe3974174a6a50807778e5491c7/medalsocial-sdk-1.5.0.tgz","_integrity":"sha512-dBC3g8D8CWvoCBJTHeCmAXjLpZmlOndB1ZzAMaXb+hQGeY/3KDtaMU2YtE5CxhpEqCjRAbkzf+H54W3RiYsvxw==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.17.0","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, helpdesk, webhooks, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.14.3","knip":"^6.29.0","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^4.1.10","typedoc":"^0.28.20","only-allow":"^1.2.1","secretlint":"^13.0.4","typescript":"^6.0.3","@types/node":"^24.13.3","lint-staged":"^17.2.0","@redocly/cli":"^2.42.0","@biomejs/biome":"^2.5.6","@changesets/cli":"^2.31.1","@commitlint/cli":"^21.2.1","@tanstack/intent":"0.3.6","openapi-typescript":"^7.13.0","@vitest/coverage-v8":"^4.1.10","@changesets/changelog-github":"^0.7.0","@commitlint/config-conventional":"^21.2.0","@secretlint/secretlint-rule-preset-recommend":"^13.0.4"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.5.0_1786805083169_0.44027033336502996","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@medalsocial/sdk","version":"1.6.0","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media","tanstack-intent"],"author":{"name":"Medal Social / Ali Aljumaili"},"license":"Apache-2.0","_id":"@medalsocial/sdk@1.6.0","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"1969fe5125a10fd6e65c7f4a9c988ec29c971df2","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.6.0.tgz","fileCount":26,"integrity":"sha512-k+CYoTBwyfZo0aMbYxlHiPYa9nnhmM8PbDTp5C1CpXF9yzAJ0D+dcAerMSkksvML+MWPgLIEqtTtibQDcD6Bzg==","signatures":[{"sig":"MEYCIQDel9i7A9ARiwibm//DL+V2AcY1h9/3ZQc9+NkhL08x6wIhAOjHQ1G4GDHTpAz+3CgoYa8LY2pXhxVlEjGMIsgM1qxn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1027699},"main":"dist/src/index.js","_from":"file:medalsocial-sdk-1.6.0.tgz","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"},"./openapi.json":{"default":"./dist/openapi/medal-social.openapi.json"},"./openapi.yaml":"./openapi/medal-social.openapi.yaml","./openapi-types":{"types":"./dist/src/openapi.generated.d.ts","import":"./dist/src/openapi.generated.mjs","require":"./dist/src/openapi.generated.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"pnpm openapi:types && tsup && pnpm openapi:bundle","clean":"rm -rf dist","quality":"pnpm lint && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","openapi:lint":"redocly lint openapi/medal-social.openapi.yaml","verify:paths":"node scripts/verify-package-paths.mjs","openapi:check":"pnpm openapi:lint && pnpm openapi:types && pnpm openapi:bundle && pnpm openapi:coverage","openapi:types":"openapi-typescript && biome format --write src/openapi.generated.ts","openapi:bundle":"node -e \"require('node:fs').mkdirSync('dist/openapi',{recursive:true})\" && redocly bundle openapi/medal-social.openapi.yaml --output dist/openapi/medal-social.openapi.json","openapi:coverage":"node scripts/assert-openapi-sdk-coverage.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"_resolved":"/tmp/712d4e8abf70668ae9e3bca01528809f/medalsocial-sdk-1.6.0.tgz","_integrity":"sha512-k+CYoTBwyfZo0aMbYxlHiPYa9nnhmM8PbDTp5C1CpXF9yzAJ0D+dcAerMSkksvML+MWPgLIEqtTtibQDcD6Bzg==","repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"_npmVersion":"11.17.0","description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, helpdesk, webhooks, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.14.3","knip":"^6.29.0","tsup":"^8.3.0","husky":"^9.1.6","vitest":"^4.1.10","typedoc":"^0.28.20","only-allow":"^1.2.1","secretlint":"^13.0.4","typescript":"^6.0.3","@types/node":"^24.13.3","lint-staged":"^17.2.0","@redocly/cli":"^2.42.0","@biomejs/biome":"^2.5.6","@changesets/cli":"^2.31.1","@commitlint/cli":"^21.2.1","@tanstack/intent":"0.3.6","openapi-typescript":"^7.13.0","@vitest/coverage-v8":"^4.1.10","@changesets/changelog-github":"^0.7.0","@commitlint/config-conventional":"^21.2.0","@secretlint/secretlint-rule-preset-recommend":"^13.0.4"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.6.0_1787694781294_0.20066174839785544","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@medalsocial/sdk","version":"1.7.0","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media","tanstack-intent"],"author":"Medal Social / Ali Aljumaili","license":"Apache-2.0","_id":"@medalsocial/sdk@1.7.0","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"26f7d28cd297a6262a17c67865e244d8319a63b9","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.7.0.tgz","fileCount":26,"integrity":"sha512-/usex/gqXb7gq3/smEnCau4WwRpL0lfoBqkeAQETNoWBUFU+B4j2E+DHOTyuAGz4o/UvJRMeTUAnP5Qd8fDc2A==","signatures":[{"sig":"MEUCIAU6lFtEIneqeP5IkDog0HGo/Y1bDPBJt6sLdPJxfbEnAiEAhsKMN06lbSrim8LlyY8JOd93G6HXhb/Gztj1LvSqEHA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1339880},"main":"dist/src/index.js","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"},"./openapi.json":{"default":"./dist/openapi/medal-social.openapi.json"},"./openapi.yaml":"./openapi/medal-social.openapi.yaml","./openapi-types":{"types":"./dist/src/openapi.generated.d.ts","import":"./dist/src/openapi.generated.mjs","require":"./dist/src/openapi.generated.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"pnpm openapi:types && tsup && pnpm openapi:bundle","clean":"rm -rf dist","quality":"pnpm lint && pnpm typecheck && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","openapi:lint":"redocly lint openapi/medal-social.openapi.yaml","verify:paths":"node scripts/verify-package-paths.mjs","openapi:check":"pnpm openapi:lint && pnpm openapi:types && pnpm openapi:bundle && pnpm openapi:coverage","openapi:types":"openapi-typescript && biome format --write src/openapi.generated.ts","test:coverage":"vitest run --coverage","openapi:bundle":"node -e \"require('node:fs').mkdirSync('dist/openapi',{recursive:true})\" && redocly bundle openapi/medal-social.openapi.yaml --output dist/openapi/medal-social.openapi.json","openapi:coverage":"node scripts/assert-openapi-sdk-coverage.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, helpdesk, webhooks, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.14.3","knip":"^6.32.2","tsup":"^8.5.1","husky":"^9.1.7","vitest":"^4.1.11","typedoc":"^0.28.20","only-allow":"^1.2.2","secretlint":"^13.0.4","typescript":"^6.0.3","@types/node":"^26.3.0","lint-staged":"^17.3.0","@redocly/cli":"^2.47.0","@biomejs/biome":"^2.5.10","@changesets/cli":"^3.0.1","@commitlint/cli":"^21.2.2","@tanstack/intent":"0.3.6","openapi-typescript":"^7.13.0","@vitest/coverage-v8":"^4.1.11","@changesets/changelog-github":"^1.0.0","@commitlint/config-conventional":"^21.2.2","@secretlint/secretlint-rule-preset-recommend":"^13.0.4"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.7.0_1788346192787_0.8489604949050964","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@medalsocial/sdk","version":"1.8.0","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media","tanstack-intent"],"author":"Medal Social / Ali Aljumaili","license":"Apache-2.0","_id":"@medalsocial/sdk@1.8.0","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"aad6c9da31e6caec3066a7eb8269c5d91fb6a7df","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.8.0.tgz","fileCount":26,"integrity":"sha512-k7oq8a6w/2VNVUaBpFLl6Mi2X8gWMN+zquvuk2nVa8ul/ycHasUvpHUOXv5z4sene0PQP16tZo0kvmm8IC/dWA==","signatures":[{"sig":"MEYCIQDump+7bhIazBmXp1rwwhAInOPuy08sZkL5cyztiOc6mgIhAMhKppDasiJn1/ZIzu6llib8jiEHzbQqaleHK33lRix8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1492965},"main":"dist/src/index.js","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"},"./openapi.json":{"default":"./dist/openapi/medal-social.openapi.json"},"./openapi.yaml":"./openapi/medal-social.openapi.yaml","./openapi-types":{"types":"./dist/src/openapi.generated.d.ts","import":"./dist/src/openapi.generated.mjs","require":"./dist/src/openapi.generated.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"pnpm openapi:types && tsup && pnpm openapi:bundle","clean":"rm -rf dist","quality":"pnpm lint && pnpm typecheck && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","openapi:lint":"redocly lint openapi/medal-social.openapi.yaml","verify:paths":"node scripts/verify-package-paths.mjs","openapi:check":"pnpm openapi:lint && pnpm openapi:types && pnpm openapi:bundle && pnpm openapi:coverage","openapi:types":"openapi-typescript && biome format --write src/openapi.generated.ts","test:coverage":"vitest run --coverage","openapi:bundle":"node -e \"require('node:fs').mkdirSync('dist/openapi',{recursive:true})\" && redocly bundle openapi/medal-social.openapi.yaml --output dist/openapi/medal-social.openapi.json","openapi:coverage":"node scripts/assert-openapi-sdk-coverage.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, helpdesk, webhooks, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.14.3","knip":"^6.32.2","tsup":"^8.5.1","husky":"^9.1.7","vitest":"^4.1.11","typedoc":"^0.28.20","only-allow":"^1.2.2","secretlint":"^13.0.4","typescript":"^6.0.3","@types/node":"^26.3.0","lint-staged":"^17.3.0","@redocly/cli":"^2.47.0","@biomejs/biome":"^2.5.10","@changesets/cli":"^3.0.1","@commitlint/cli":"^21.2.2","@tanstack/intent":"0.3.6","openapi-typescript":"^7.13.0","@vitest/coverage-v8":"^4.1.11","@changesets/changelog-github":"^1.0.0","@commitlint/config-conventional":"^21.2.2","@secretlint/secretlint-rule-preset-recommend":"^13.0.4"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.8.0_1788676253072_0.8998991203239859","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@medalsocial/sdk","version":"1.9.0","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media","tanstack-intent"],"author":"Medal Social / Ali Aljumaili","license":"Apache-2.0","_id":"@medalsocial/sdk@1.9.0","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"e342e4836c8fda6362dbf7050e36eba562e13614","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.9.0.tgz","fileCount":26,"integrity":"sha512-FrEhQwu5e3erS/m0qxKM6ryMLWeOe1lyt5NtSDNjl/b+DBENTOtmsEnYXewK0BgNQucKYFJP5J/57QPic6byKw==","signatures":[{"sig":"MEYCIQD7fxbJey3RXMDfTKQdC2OEyxW0LrEmUu4piVbvTh73owIhAOsTZYWXqY21yEJrk33sanwhO4HDu+9Oi4J4Vfm0H9O2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1606349},"main":"dist/src/index.js","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"},"./openapi.json":{"default":"./dist/openapi/medal-social.openapi.json"},"./openapi.yaml":"./openapi/medal-social.openapi.yaml","./openapi-types":{"types":"./dist/src/openapi.generated.d.ts","import":"./dist/src/openapi.generated.mjs","require":"./dist/src/openapi.generated.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"pnpm openapi:types && tsup && pnpm openapi:bundle","clean":"rm -rf dist","quality":"pnpm lint && pnpm typecheck && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","openapi:lint":"redocly lint openapi/medal-social.openapi.yaml","verify:paths":"node scripts/verify-package-paths.mjs","openapi:check":"pnpm openapi:lint && pnpm openapi:types && pnpm openapi:bundle && pnpm openapi:coverage","openapi:types":"openapi-typescript && biome format --write src/openapi.generated.ts","test:coverage":"vitest run --coverage","openapi:bundle":"node -e \"require('node:fs').mkdirSync('dist/openapi',{recursive:true})\" && redocly bundle openapi/medal-social.openapi.yaml --output dist/openapi/medal-social.openapi.json","openapi:coverage":"node scripts/assert-openapi-sdk-coverage.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, helpdesk, webhooks, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.14.3","knip":"^6.32.2","tsup":"^8.5.1","husky":"^9.1.7","vitest":"^4.1.11","typedoc":"^0.28.20","only-allow":"^1.2.2","secretlint":"^13.0.4","typescript":"^6.0.3","@types/node":"^26.3.0","lint-staged":"^17.3.0","@redocly/cli":"^2.47.0","@biomejs/biome":"^2.5.10","@changesets/cli":"^3.0.1","@commitlint/cli":"^21.2.2","@tanstack/intent":"0.3.6","openapi-typescript":"^7.13.0","@vitest/coverage-v8":"^4.1.11","@changesets/changelog-github":"^1.0.0","@commitlint/config-conventional":"^21.2.2","@secretlint/secretlint-rule-preset-recommend":"^13.0.4"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.9.0_1788947131770_0.3430722514106235","host":"s3://npm-registry-packages-npm-production"}},"1.10.0":{"name":"@medalsocial/sdk","version":"1.10.0","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media","tanstack-intent"],"author":"Medal Social / Ali Aljumaili","license":"Apache-2.0","_id":"@medalsocial/sdk@1.10.0","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"70a98d0b498b1f6c3b1025544c2e159f87ec50db","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.10.0.tgz","fileCount":26,"integrity":"sha512-gHRnXIXDesAWUkvK//DNuuRr43JrF0NxBN7KjniVcBQtejWyW0TDoIruaYWwmanwGqtiHS5LtQf4rPGSEh13HQ==","signatures":[{"sig":"MEYCIQCoYj3xTxN6rCYBmzB0YReHLk75Ei912msPeW4s4JretAIhALKDB2NzP7ATK/jUXl72J9O0FflQp7W7VywYzoCnNb0A","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1691440},"main":"dist/src/index.js","types":"dist/src/index.d.ts","module":"dist/src/index.mjs","engines":{"node":">=24"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"},"./openapi.json":{"default":"./dist/openapi/medal-social.openapi.json"},"./openapi.yaml":"./openapi/medal-social.openapi.yaml","./openapi-types":{"types":"./dist/src/openapi.generated.d.ts","import":"./dist/src/openapi.generated.mjs","require":"./dist/src/openapi.generated.js"}},"scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"pnpm openapi:types && tsup && pnpm openapi:bundle","clean":"rm -rf dist","quality":"pnpm lint && pnpm typecheck && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish && pnpm exec jsr publish","version":"changeset version && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('./package.json','utf8'));const j=JSON.parse(fs.readFileSync('./jsr.json','utf8'));j.version=p.version;fs.writeFileSync('./jsr.json',JSON.stringify(j,null,2)+'\\n')\"","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","openapi:lint":"redocly lint openapi/medal-social.openapi.yaml","verify:paths":"node scripts/verify-package-paths.mjs","openapi:check":"pnpm openapi:lint && pnpm openapi:types && pnpm openapi:bundle && pnpm openapi:coverage","openapi:types":"openapi-typescript && biome format --write src/openapi.generated.ts","test:coverage":"vitest run --coverage","openapi:bundle":"node -e \"require('node:fs').mkdirSync('dist/openapi',{recursive:true})\" && redocly bundle openapi/medal-social.openapi.yaml --output dist/openapi/medal-social.openapi.json","openapi:coverage":"node scripts/assert-openapi-sdk-coverage.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, helpdesk, webhooks, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"sideEffects":false,"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.14.3","knip":"^6.32.2","tsup":"^8.5.1","husky":"^9.1.7","vitest":"^4.1.11","typedoc":"^0.28.20","only-allow":"^1.2.2","secretlint":"^13.0.4","typescript":"^6.0.3","@types/node":"^26.3.0","lint-staged":"^17.3.0","@redocly/cli":"^2.47.0","@biomejs/biome":"^2.5.10","@changesets/cli":"^3.0.1","@commitlint/cli":"^21.2.2","@tanstack/intent":"0.3.6","openapi-typescript":"^7.13.0","@vitest/coverage-v8":"^4.1.11","@changesets/changelog-github":"^1.0.0","@commitlint/config-conventional":"^21.2.2","@secretlint/secretlint-rule-preset-recommend":"^13.0.4"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.10.0_1788975212202_0.03665614514544546","host":"s3://npm-registry-packages-npm-production"}},"1.11.0":{"_id":"@medalsocial/sdk@1.11.0","bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"dist":{"shasum":"b9b5d9129eb8e39a652bf023a5c7a4975fe1a807","tarball":"https://registry.npmjs.org/@medalsocial/sdk/-/sdk-1.11.0.tgz","fileCount":26,"integrity":"sha512-S0SVhiXLb2EZM9cVY2+mh0gbFHZl+/TUN/TTPokMIsBXDSbhk6Ft1N17JrsCs+mFpzXlnc9Me4jAhOW/xws+Ow==","signatures":[{"sig":"MEUCIQD9JqZ6mnN/cmBTU0VR1pycddgRtOYLA2uzW8ZcyxjFxwIgdi85zS1BvOyjladOvIX15vmOHSx+dezauOL2aUZzT0I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEjSH7kSzJjEb1QSpQpLud8ad81/H+5MMC8fkfU6uIx8AiEAshSpMZESZtIhzZlHheGUVAtvc7HCaWYp3T3+GNAbbHA="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@medalsocial%2fsdk@1.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2289635},"main":"dist/src/index.js","name":"@medalsocial/sdk","types":"dist/src/index.d.ts","author":"Medal Social / Ali Aljumaili","module":"dist/src/index.mjs","engines":{"node":">=22"},"exports":{".":{"types":"./dist/src/index.d.ts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"},"./pilot":{"types":"./dist/pilot/index.d.ts","import":"./dist/pilot/index.mjs","require":"./dist/pilot/index.js"},"./openapi.json":{"default":"./dist/openapi/medal-social.openapi.json"},"./openapi.yaml":"./openapi/medal-social.openapi.yaml","./openapi-types":{"types":"./dist/src/openapi.generated.d.ts","import":"./dist/src/openapi.generated.mjs","require":"./dist/src/openapi.generated.js"}},"license":"Apache-2.0","scripts":{"dev":"tsup src/index.ts --watch","docs":"typedoc","lint":"biome check .","test":"vitest run","build":"pnpm openapi:types && tsup && pnpm openapi:bundle","clean":"rm -rf dist","quality":"pnpm lint && pnpm typecheck && pnpm test","release":"pnpm build && pnpm verify:paths && changeset publish","version":"changeset version && node scripts/sync-version.mjs","lint:fix":"biome check --fix .","changeset":"changeset","typecheck":"tsc --noEmit && tsc -p tsconfig.test.json --noEmit","knip:check":"knip","preinstall":"npx only-allow pnpm","test:watch":"vitest","jsr:publish":"node scripts/jsr-publish.mjs","knip:report":"knip --reporter json --no-exit-code","secret:scan":"node scripts/secretlint-repo.mjs","openapi:lint":"redocly lint openapi/medal-social.openapi.yaml","verify:paths":"node scripts/verify-package-paths.mjs","openapi:check":"pnpm openapi:lint && pnpm openapi:types && pnpm openapi:bundle && pnpm openapi:coverage","openapi:types":"openapi-typescript && biome format --write src/openapi.generated.ts","test:coverage":"vitest run --coverage","version:check":"node scripts/sync-version.mjs --check","openapi:bundle":"node -e \"require('node:fs').mkdirSync('dist/openapi',{recursive:true})\" && redocly bundle openapi/medal-social.openapi.yaml --output dist/openapi/medal-social.openapi.json","openapi:coverage":"node scripts/assert-openapi-sdk-coverage.mjs","secret:scan:staged":"node scripts/secretlint-staged.mjs"},"version":"1.11.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5cdb89de-5e64-47d0-aa29-ce228ae1b816"}},"homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media","tanstack-intent"],"repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, helpdesk, webhooks, and GDPR compliance","directories":{},"lint-staged":{"*.{js,cjs,mjs,jsx,ts,tsx,json,jsonc,md,yml,yaml}":["biome check --write --no-errors-on-unmatched"]},"maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"sideEffects":false,"_nodeVersion":"24.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jsr":"^0.14.3","zod":"^4.4.3","knip":"^6.35.1","tsup":"^8.5.1","husky":"^9.1.7","vitest":"^4.1.11","typedoc":"^0.28.20","only-allow":"^1.2.2","secretlint":"^13.0.5","typescript":"^6.0.3","@types/node":"^26.5.0","lint-staged":"^17.5.0","@redocly/cli":"^2.51.2","@biomejs/biome":"^2.5.12","@changesets/cli":"^3.0.2","@commitlint/cli":"^21.2.2","@tanstack/intent":"0.3.6","openapi-typescript":"^7.13.0","@vitest/coverage-v8":"^4.1.11","@changesets/changelog-github":"^1.0.1","@commitlint/config-conventional":"^21.2.2","@secretlint/secretlint-rule-preset-recommend":"^13.0.5"},"peerDependencies":{"zod":"^4.4.3"},"peerDependenciesMeta":{"zod":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_1.11.0_1789313726913_0.08627353723445519"}}},"time":{"created":"2025-09-12T21:53:01.180Z","modified":"2026-09-13T15:35:27.335Z","0.1.1":"2025-09-12T21:53:01.516Z","0.1.2":"2025-09-12T21:55:49.650Z","1.0.0":"2026-04-03T04:56:44.754Z","1.1.1":"2026-04-21T11:57:48.906Z","1.1.2":"2026-04-21T12:07:56.164Z","1.1.3":"2026-04-21T12:30:10.292Z","1.1.4":"2026-04-21T13:24:49.721Z","1.1.5":"2026-05-03T14:14:32.658Z","1.1.6":"2026-05-09T00:01:17.367Z","1.1.7":"2026-05-17T14:55:55.287Z","1.2.0":"2026-05-24T10:09:54.182Z","1.2.1":"2026-05-25T19:29:20.842Z","1.3.0":"2026-07-07T00:58:10.907Z","1.4.0":"2026-07-30T18:58:55.419Z","1.5.0":"2026-08-15T14:44:43.312Z","1.6.0":"2026-08-25T21:53:01.511Z","1.7.0":"2026-09-02T10:49:52.915Z","1.8.0":"2026-09-06T06:30:53.266Z","1.9.0":"2026-09-09T09:45:31.916Z","1.10.0":"2026-09-09T17:33:32.388Z","1.11.0":"2026-09-13T15:35:27.029Z"},"bugs":{"url":"https://github.com/Medal-Social/MedalSocial-SDK/issues"},"author":"Medal Social / Ali Aljumaili","license":"Apache-2.0","homepage":"https://github.com/Medal-Social/MedalSocial-SDK#readme","keywords":["medal","social","sdk","api","typescript","client","crm","email","gdpr","contacts","deals","posts","social-media","tanstack-intent"],"repository":{"url":"git+https://github.com/Medal-Social/MedalSocial-SDK.git","type":"git"},"description":"TypeScript SDK for Medal Social API — posts, emails, contacts, deals, helpdesk, webhooks, and GDPR compliance","maintainers":[{"name":"alioftech","email":"ali@medalsocial.com"},{"name":"medal-pilot","email":"hi@medalsocial.com"}],"readme":"# Medal Social SDK\n\nTypeScript SDK for the [Medal Social](https://medalsocial.com) API. Manage posts, emails, contacts, deals, helpdesk conversations, webhooks, company/site scans, and GDPR compliance programmatically.\n\n## Install\n\n```bash\nnpm install @medalsocial/sdk\n# or\npnpm add @medalsocial/sdk\n```\n\nNo runtime dependencies. The optional `@medalsocial/sdk/pilot` entry (zod tool\nschemas for agents) needs `zod` 4, declared as an **optional peer** — install it\nonly if you import that entry:\n\n```bash\npnpm add zod\n```\n\n## Quick Start\n\n```ts\nimport { Medal } from '@medalsocial/sdk';\n\nconst medal = new Medal('medal_xxx');\n\n// Create and schedule a social post\nconst { data: post } = await medal.posts.create({\n  content: 'Hello from the Medal Social SDK!',\n  channel_ids: ['ch_1'],\n});\nawait medal.posts.schedule(post.id, { scheduled_at: '2026-03-15T10:00:00Z' });\n\n// Send a transactional email\nawait medal.emails.send({\n  template_slug: 'welcome',\n  to: 'user@example.com',\n  variables: { name: 'John' },\n});\n\n// Manage contacts\nconst { data: contactRef } = await medal.contacts.create({\n  email: 'john@example.com',\n  first_name: 'John',\n  status: 'lead',\n});\nconst { data: contact } = await medal.contacts.get(contactRef.id);\n```\n\n## Authentication\n\nTwo authentication methods are supported:\n\n### API Key (recommended for server-side)\n\nCreate an API key in your workspace settings. Keys are prefixed with `medal_` and scoped to a single workspace.\n\n```ts\nconst medal = new Medal('medal_xxx');\n\n// With options\nconst medal = new Medal('medal_xxx', {\n  baseUrl: 'https://io.medalsocial.com', // default\n  timeout: 30000, // default, in ms\n});\n```\n\n### OAuth Access Token\n\nFor OAuth integrations, pass the access token and the target workspace ID:\n\n```ts\nconst medal = new Medal('oauth_access_token', {\n  workspaceId: 'workspace_id', // required for OAuth\n});\n```\n\nOAuth tokens are obtained through the Medal Social OAuth flow (`/api/auth/oauth2/authorize`). The `workspaceId` is required because OAuth tokens can access multiple workspaces.\n\n## Resources\n\n### Posts\n\n```ts\n// List connected channels\nconst { data: channels } = await medal.posts.channels();\n\n// Create a post\nconst { data } = await medal.posts.create({\n  type: 'social',       // 'social' | 'newsletter' | 'blog'\n  content: 'Hello!',\n  channel_ids: ['ch_1'],\n});\n\n// Get post with per-channel variants\nconst { data: post } = await medal.posts.get(data.id);\nconsole.log(post.variants); // platform-specific status, permalinks\n\n// Update a draft\nawait medal.posts.update(data.id, { content: 'Updated!' });\n\n// Schedule or publish\nawait medal.posts.schedule(data.id, { scheduled_at: '2026-03-15T10:00:00Z' });\nawait medal.posts.publish(data.id);\n\n// List posts — status is the closed PostStatus set; date filters take Unix ms or ISO 8601\nconst posts = await medal.posts.list({\n  status: 'scheduled',\n  type: 'social',\n  platforms: ['linkedin', 'x'],\n  scheduled_from: '2026-07-01T00:00:00Z',\n  scheduled_to: Date.now() + 7 * 86_400_000,\n  query: 'launch',\n  limit: 50,\n});\n\n// Delete\nawait medal.posts.remove(data.id);\n```\n\n### Emails\n\n```ts\n// Send transactional email\nconst { data: sent } = await medal.emails.send({\n  template_slug: 'welcome',\n  to: 'user@example.com',\n  name: 'John',\n  locale: 'en',\n  variables: { company: 'Acme' },\n  contact_id: 'c_123', // optional: link to a contact\n});\n\n// Check delivery status\nconst { data: status } = await medal.emails.get(sent.id);\nconsole.log(status.status); // 'queued' | 'sent' | 'delivered' | 'opened' | 'clicked'\n\n// Batch send (max 100 recipients)\nconst { data: batch } = await medal.emails.batch({\n  template_slug: 'newsletter',\n  default_locale: 'en',\n  recipients: [\n    { email: 'a@test.com', name: 'Alice', variables: { code: 'A1' } },\n    { email: 'b@test.com', name: 'Bob' },\n  ],\n});\nconsole.log(batch.batch_id, batch.total, batch.queued, batch.failed);\n\n// Templates\nconst { data: templates } = await medal.emails.templates.list();\nconst { data: template } = await medal.emails.templates.get('welcome', {\n  locale: 'ar',\n  fallback_locale: 'en',\n});\n```\n\n### Contacts\n\n```ts\n// CRUD\nconst { data: created } = await medal.contacts.create({\n  email: 'john@example.com',\n  first_name: 'John',\n  last_name: 'Doe',\n  company: 'Acme',\n  job_title: 'CTO',\n  status: 'lead',\n  label_ids: ['lbl_1'],\n  custom_fields: { source: 'website' },\n});\n\nconst { data: contact } = await medal.contacts.get(created.id);\nconst { data: updated } = await medal.contacts.update(created.id, { status: 'customer' });\nconst { data: removed } = await medal.contacts.remove(created.id);\nconsole.log(updated.success, removed.success);\n\n// List with filters — status is 'lead' | 'subscriber' | 'customer' | 'churned'\nconst contacts = await medal.contacts.list({\n  status: 'lead',\n  email_status: 'subscribed',\n  label_ids: ['lbl_1'],\n  search: 'john',\n  limit: 50,\n});\n\n// \"The contact for this e-mail\": exact match, not a fuzzy search\nconst { data: [byEmail] } = await medal.contacts.list({ email: 'john@example.com' });\n\n// Activity timeline\nconst activities = await medal.contacts.activities('contact_id', { limit: 20 });\n\n// Add a note\nconst { data: note } = await medal.contacts.addNote('contact_id', { content: 'Follow up next week' });\nconsole.log(note.id);\n\n// Bulk import (max 500)\nconst { data: result } = await medal.contacts.import([\n  { email: 'a@test.com', first_name: 'Alice' },\n  { email: 'b@test.com', first_name: 'Bob' },\n]);\nconsole.log(result.added, result.skipped);\n```\n\n### Deals\n\n```ts\nconst { data: created } = await medal.deals.create({\n  title: 'Enterprise Partnership',\n  value: 50000,\n  currency: 'USD',\n  brand_name: 'Acme Corp',\n  contact_id: 'c_123',\n  notes: 'Initial outreach',\n});\nconst { data: deal } = await medal.deals.get(created.id);\n\n// Move it along the pipeline: draft → negotiating → offer_sent → signed → completed | declined\nconst { data: updated } = await medal.deals.update(deal.id, { status: 'signed' });\nconst { data: unlinked } = await medal.deals.update(deal.id, { contact_id: null }); // unlink contact\n\nconst deals = await medal.deals.list({\n  status: 'negotiating',\n  search: 'Acme',\n  contact_id: 'c_123',\n  min_value: 25000,\n  close_date_from: '2026-07-01T00:00:00Z', // Unix ms or ISO 8601\n  close_date_to: Date.now() + 30 * 86_400_000,\n});\nconst { data: removed } = await medal.deals.remove(deal.id);\nconsole.log(updated.success, unlinked.success, removed.success);\n```\n\nA deal always starts at `draft`; `status` is only accepted on `update`, and only the six values above — anything else is a `400`. **Dates are asymmetric:** `start_date` / `end_date` are *sent* as ISO 8601 (or `YYYY-MM-DD`) strings but come *back* as Unix milliseconds (`number | null`), so `new Date(deal.end_date)` is the right call on the way out.\n\n**`value` is in MAJOR currency units** — `50000` is fifty thousand kroner, not\nfive hundred — and decimals are accepted (`1999.5`). This is the opposite\nconvention from bookings, where money is integer **øre** (`amount_ore`,\n`price_ore`), and a deal carries no minor-unit field at all: if you use both\nsurfaces, convert explicitly (`value = amount_ore / 100`). `currency` is one of\n`USD` / `EUR` / `GBP` / `NOK`; anything else is a `400`.\n\n### Bookings\n\nMoney is always **integer øre** (`amount_ore`, `price_ore`) — never a float, never kroner. Timestamps come back as ISO 8601 strings; on the way in, either Unix milliseconds or an ISO string is accepted.\n\n```ts\n// Catalogue + free slots (services.list() / resources.list() are the same calls)\nconst { data: services } = await medal.bookings.services.list();\nconst { data: resources } = await medal.bookings.resources.list();\nconst { data: slots } = await medal.bookings.availability({\n  service_id: services[0].id,\n  from_ts: Date.now(),\n  to_ts: Date.now() + 7 * 86_400_000,\n  resource_id: resources[0].id,     // optional — defaults to every capable resource\n});\n\n// Book a party — all items succeed or none do (max 50)\nconst { data: created } = await medal.bookings.create(\n  {\n    items: [\n      { service_id: services[0].id, start_ts: slots[0].start_ts! },\n      { service_id: services[0].id, start_ts: slots[1].start_ts!, booked_for_name: 'Ida', booked_for_birth_year: 2018 },\n    ],\n    contact: { phone: '+4790000000', email: 'ida@example.com', name: 'Ida Hansen' },\n    notes: 'Bursdag',\n  },\n  { idempotencyKey: crypto.randomUUID() },   // optional — see the note below\n);\n// created.bookings[i].manage_token is returned EXACTLY ONCE (only its hash is\n// stored, and an idempotent replay omits it) — persist it for the manage link.\n// It is UNRECOVERABLE if lost: `Booking` has no token field, so re-reading the\n// booking gives you nothing. Reschedule to mint a fresh one, or act by id.\n\n// Staff actions — policy windows are bypassed, cancels attributed to staff\nconst { data: booking } = await medal.bookings.get(created.bookings[0].id);\nawait medal.bookings.update(booking.id, { internal_notes: 'Allergisk mot parfyme' });\nawait medal.bookings.cancel(booking.id, { reason: 'Sykdom' });\nconst { data: moved } = await medal.bookings.reschedule(booking.id, {\n  new_start_ts: '2026-09-02T09:00:00.000Z',\n  new_resource_id: resources[0].id,\n});\n// moved.booking_id is a NEW id with a NEW manage_token — the old booking is cancelled\nawait medal.bookings.markNoShow(moved.booking_id);\n\n// Listing — check `truncated`: when true, matching bookings exist that no\n// cursor reaches, so narrow the from_ts/to_ts window\nconst page = await medal.bookings.list({ status: 'confirmed', from_ts: Date.now(), limit: 50 });\n// \"How many bookings did our website bring in?\" — created_via filters the WHOLE column\nconst fromSite = await medal.bookings.list({ created_via: 'web', from_ts: monthStart, to_ts: monthEnd });\nconsole.log(page.pagination.has_more, page.pagination.next_cursor, page.pagination.truncated);\n```\n\n#### The day, and what needs a human\n\n```ts\n// The salon's operating summary for ONE local date. date_key is the WORKSPACE's\n// calendar date (yyyymmdd), so a caller in another zone still reads the salon's\n// day; omit it for today.\nconst { data: today } = await medal.bookings.today();\ntoday.remaining;                 // appointments still to come\ntoday.closed_for_today;          // past the last opening window of a day that DID open\ntoday.next_gap?.start_ts;        // next free stretch, as an instant\ntoday.revenue.total_ore;         // integer øre, split in revenue.by_provider\ntoday.truncated;                 // a source hit its cap, so the counts are floors\n\n// Open items a human has to act on. NOT a page: `truncated` is a read budget,\n// not a cursor, and `total` is exact only while it is false.\nconst attention = await medal.bookings.attention();\nfor (const item of attention.data) {\n  // No prose crosses the wire — render the sentence from `kind`\n  // (payment_failed | payment_released | payment_partial_capture |\n  //  waitlist_offer_expiring | event_consent_missing | booking_attachment |\n  //  no_show_today) and the ids/amounts on the item.\n  render(item.kind, item.booking_id, item.amount_ore, item.deadline_at);\n}\n```\n\n**Customer actions go through `medal.bookings.manage`**, keyed by the manage token instead of the booking id. This is not the same route with a different lookup key: the workspace's cancel/reschedule windows are **enforced**, and the cancel is attributed to the customer. Use it to relay a customer's own click on the link in their confirmation email.\n\n```ts\nconst { data: summary } = await medal.bookings.manage.get(manageToken);\nif (summary.can_cancel) await medal.bookings.manage.cancel(manageToken, { reason: 'Endret plan' });\nif (summary.can_reschedule) {\n  const { data } = await medal.bookings.manage.reschedule(manageToken, {\n    new_start_ts: '2026-09-02T09:00:00.000Z',\n  });\n  console.log(data.booking_id, data.manage_token); // old token stops working\n}\n```\n\n`can_cancel` / `can_reschedule` already apply the policy windows — honour them rather than re-deriving from `cancel_window_hours`.\n\n**Booking writes are idempotent by default.** The SDK retries 429/5xx automatically, so every booking `POST` (`create`, `cancel`, `reschedule`, `markNoShow`, `payment.start`, and the `manage` writes) carries a generated `Idempotency-Key` — a retry after a gateway failure replays the original result instead of booking the slot twice. Supply your own `options.idempotencyKey` to extend that guarantee across *your* retries too: the server remembers a key for 24 hours, keyed by `(key, workspace, method + path)`.\n\n`update(id, input)` requires at least one of `notes` / `internal_notes`; `update(id, {})` is a compile error, matching the API's own 400.\n\n#### Persons, relations and events\n\n`medal.bookings.persons` are the children, pets, or employees a contact books for — no login of their own. `medal.bookings.relations` links two contacts directionally (guardian, employer, partner, and so on). `medal.bookings.events` are arrangementer — scheduled group sessions bookings register against.\n\n```ts\n// Persons a contact books for (active-only unless include_inactive)\nconst { data: persons } = await medal.bookings.persons.list(contact.id);\n\n// Add a person under a contact\nconst { data: person } = await medal.bookings.persons.create({\n  contact_id: contact.id,\n  name: 'Ola',\n  birth_year: 2018,\n  relation_type: 'guardian',\n});\n\n// Events in a date range (yyyy-mm-dd, inclusive) — one month, optionally one host\nconst { data: events } = await medal.bookings.events.list({\n  from: '2026-09-01',\n  to: '2026-09-30',\n  host_id: resources[0].id,   // optional\n});\n\n// Register a child for an arrangement\nconst { data: registration } = await medal.bookings.events.register(events[0].event_id, {\n  guardian: { name: 'Kari Hansen', email: 'kari@example.no', phone: '+4790000000' },\n  child: { name: 'Nora', birth_year: 2020 },\n  service_id: services[0].id,\n  consent_accepted: true,           // must be literally true — 400 otherwise\n  consent_version: '2026-09',       // optional — your own label for the wording shown\n  return_url: 'https://example.no/retur',   // only needed if the service requires payment\n});\n// registration.booking carries event_id / event_order; registration.manage_token is\n// SHOW-ONCE like CreatedBooking.manage_token (omitted entirely on an idempotent replay).\n// registration.contact_id / registration.person_id are the guardian's contact and the\n// child's ContactPerson, created or reused. registration.payment is null when the\n// service needs no payment, otherwise the same show-once redirect payment.start returns.\n// A payment failure does not undo the registration — check registration.payment_error\n// and retry with bookings.payment.start(registration.booking.id, ...) rather than\n// registering again.\n\n// An arrangement's roster, ordered by event_order (cancelled rows included)\nconst { data: roster } = await medal.bookings.events.registrations(events[0].event_id);\nroster.registrations[0]?.participant_name;   // read from the live person, not a snapshot\nroster.truncated;                            // true past 300 rows — event_order is no longer trustworthy\n\n// Hosts — where an arrangement is held. A landing page resolves one by `slug`\n// instead of putting the host id in the URL.\nconst { data: hosts } = await medal.bookings.events.hosts.list();\n// Find-or-create BY NAME: 201 when a row was inserted, 200 when an existing host\n// matched — and a matched host comes back UNCHANGED, so a corrected address sent\n// here is dropped.\nconst { data: host } = await medal.bookings.events.hosts.create({\n  name: 'Sol barnehage',\n  address: 'Solveien 1',\n  note: 'inngang B, ring på',\n});\n// …which is why correcting one has its own route. `null` erases; `retired: true`\n// retires the host (events already point at it, so it is never deleted).\nawait medal.bookings.events.hosts.update(host.id, { address: 'Solveien 2', note: null });\n\n// Remove an arrangement DAY — the one delete on this surface. OAuth callers need\n// the workspace `admin` role. A completed day is 422; a day with any\n// non-cancelled registration is 409 (cancel those first, which releases each\n// participant's place and payment hold).\nconst { data: removed } = await medal.bookings.events.remove(events[0].event_id);\nremoved.mode; // 'hard' = the row is gone; 'soft' = kept as a tombstone for cancelled registrations\n```\n\n#### Payments\n\n`medal.bookings.payment` takes a Vipps payment on a booking as the business; `medal.bookings.manage.payment` does the same on the customer's behalf, keyed by the manage token. `Booking.payment_mode` (and `ManageSummary.payment_mode`) says what the booking requires — `payment_status: 'none'` cannot tell \"owes nothing\" from \"has not paid yet\".\n\n```ts\nconst { data: started } = await medal.bookings.payment.start(booking.id, {\n  return_url: 'https://example.no/retur',\n  terms_accepted: true,          // must be literally true — 400 otherwise\n  terms_version: '2026-09',\n});\n// Hand started.redirect_url to the Vipps Widget SDK UNCHANGED. It is SHOW-ONCE:\n// payment.get() never returns it, and the payment behind it expires in 10 minutes.\n\nconst { data: payment } = await medal.bookings.payment.get(booking.id);\npayment.state;        // created | authorized | captured | cancelled | refunded | failed | expired\npayment.captured_ore; // integer øre — a Vipps payment stays AUTHORIZED after a capture,\n                      // so the aggregates, not `state`, say what actually moved\n```\n\n**Never trust the return redirect.** The customer can close the tab, hit back, or edit the URL — the outcome reaches you through Medal. Poll on your return page, or read the booking's `payment_status`.\n\nPrepay, end to end, in four calls:\n\n```ts\nconst { data: slots } = await medal.bookings.availability({ service_id, from_ts, to_ts });\nconst { data: created } = await medal.bookings.create({\n  items: [{ service_id, start_ts: slots[0].start_ts! }],\n  contact: { phone: '+4790000000', name: 'Ida' },\n});\nconst { data: started } = await medal.bookings.payment.start(created.bookings[0].id, {\n  return_url: 'https://example.no/retur',\n  terms_accepted: true,\n});\n// …hand started.redirect_url to the Vipps Widget SDK, then on your return page:\nconst payment = await medal.bookings.payment.waitForSettlement(created.bookings[0].id);\nif (payment.state !== 'authorized' && payment.state !== 'captured') {\n  return renderRetry(payment.failure_code);\n}\n```\n\n`waitForSettlement` resolves for **every** settled state (`authorized`,\n`captured`, `cancelled`, `refunded`, `failed`, `expired`) — branch on `state`,\nnot on whether it threw. It throws only when the deadline passes with the\ncustomer still in the wallet (default ten minutes, the payment's own lifetime),\nand a `404` (no payment on the booking) propagates unchanged.\n`medal.bookings.manage.payment.waitForSettlement(manageToken)` is the\ncustomer-side twin and polls once a second, because that route has its own\n`apiBookingPoll` bucket.\n\nThe customer must accept your terms **before** a payment is initiated: `terms_accepted: true` is required by the type *and* by the API, and a request without it leaves no payment (and no consent record) behind. A `return_url` your workspace's own sites do not vouch for answers **422**, not 400 — the URL parses, it is just not yours. Starting a second payment while one is live answers **409**, and `payment.get(...)` on a booking with no payment yet answers **404**, exactly as an unknown booking does.\n\n### Customer portal\n\nSelf-service for the workspace's own customers: they sign in with an e-mailed one-time code, then see and change their profile, list their bookings, export their data, or erase their account. The API key needs `read:portal` and `write:portal`.\n\nThe session token is a **bearer credential for one contact**. Your site's server exchanges the code for it and keeps it in an **HttpOnly cookie on the site's own domain** — never hand it to the browser, and never let the browser call Medal directly. Session-bound methods take the token as their first argument and send it as `X-Portal-Session`.\n\n```ts\n// 1. Send the code. Always { status: 'sent' } — enumeration-safe, so \"sent\" does\n//    not confirm the address belongs to a contact.\n//    locale is 'no' | 'en' — the API refuses 'nb' with a 400.\nawait medal.portal.login.start({ email: 'ida@example.com', locale: 'no' });\n\n// 2. Exchange the code the customer typed. Wrong, burned and expired codes all\n//    answer 401 PORTAL_CODE_INVALID.\nconst { data: session } = await medal.portal.login.verify({ email: 'ida@example.com', code: '123456' });\n// -> set an HttpOnly, Secure, SameSite cookie holding session.session_token,\n//    expiring at session.expires_at (Unix ms)\n\n// 3. Session-bound calls, from your server, with the token read back from the cookie\nconst { data: me } = await medal.portal.me(session.session_token);\n// me.persons (the contact's bookings.persons) and me.labels (the workspace's own\n// words for the person concept, e.g. { person: 'Barn', persons: 'Barn' }) are new\nconst { data: bookings } = await medal.portal.myBookings(session.session_token);\n// bookings.upcoming[i].manage_token is set while the booking is still manageable —\n// it opens your site's manage page (medal.bookings.manage.*); past bookings carry null\nawait medal.portal.updateMe(session.session_token, {\n  phone: '+4790000000',\n  family: [{ name: 'Ola', birth_year: 2018 }],   // replaces the whole list\n  marketing_consent: true,                        // recorded as a marketing_email consent, source 'portal'\n});\nconst { data: exported } = await medal.portal.exportMyData(session.session_token); // GDPR Art. 15, synchronous\nawait medal.portal.logout(session.session_token);     // 204 — revokes this session only\n// …or, when the customer asks to be forgotten (terminal — the session is revoked, a later\n// logout() would answer 401 PORTAL_SESSION_INVALID):\nawait medal.portal.deleteMe(session.session_token);   // GDPR Art. 17 — 204\n```\n\n`401 PORTAL_SESSION_REQUIRED` (header missing) and `401 PORTAL_SESSION_INVALID` (unknown, expired or revoked) both mean \"sign in again\" — clear the cookie and send the customer back to step 1. `403 FORBIDDEN` means the key lacks the portal scopes; `429 RATE_LIMITED` applies per address and per caller on `login.start`.\n\nBind the token once instead of passing it to every method — the flat,\nsession-first methods are unchanged, this is additive:\n\n```ts\nconst me = medal.portal.session(session.session_token);\nconst { data: profile } = await me.profile();\nconst { data: bookings } = await me.bookings();\nawait me.update({ phone: '+4790000000' });\nconst { data: exported } = await me.export();\nawait me.logout();       // …or me.delete() for GDPR Art. 17\n```\n\nIt exists because the flat form takes the token **first**\n(`updateMe(session, patch)`), so a swapped pair type-checks whenever both are\nstrings.\n\nNone of the portal calls carries an `Idempotency-Key`: the two login routes cannot duplicate anything, and the session routes are either reads or terminal.\n\n#### Log in with Vipps\n\nTwo server calls; the middle leg is the customer's browser.\n\n```ts\n// 1. Your server starts the flow and redirects the customer to the wallet.\n//    return_url must be an https URL under one of the workspace's own sites —\n//    400 INVALID_RETURN_URL otherwise. 503 VIPPS_NOT_CONFIGURED means this\n//    deployment has no Vipps login: fall back to the e-mail code.\nconst { data: start } = await medal.portal.login.vipps.start({\n  return_url: 'https://salon.no/min-side',\n});\nredirect(start.authorize_url);        // never cache it — it carries a one-time state\n\n// 2. Vipps sends the customer to Medal's callback, which redirects back to your\n//    return_url with ?grant=… — or ?vipps=needs_email_login / ?vipps=failed,\n//    on which you fall back to medal.portal.login.start(...).\n\n// 3. Your server exchanges the grant. Single-use: a second exchange answers\n//    404 GRANT_NOT_FOUND, which is also the answer for an expired grant.\nconst { data: session } = await medal.portal.login.vipps.exchange({ grant });\n// -> same HttpOnly cookie as the e-mail flow; session.expires_at_iso is the ISO twin\n```\n\n**Portal booking timestamps are Unix milliseconds** (`start_ts`, `end_ts`) with\nISO twins beside them (`start_ts_iso`, `end_ts_iso`) — unlike\n`/api/v1/bookings/*`, where `start_ts` is an ISO string. The SDK types what each\nendpoint actually returns rather than normalising one into the other.\n\n### GDPR\n\n```ts\n// Consent management\nawait medal.gdpr.recordConsent({\n  email: 'user@example.com',\n  consent_type: 'marketing_email', // | 'analytics_tracking' | 'third_party_sharing'\n  granted: true,\n  source: 'signup_form',\n});\n\nconst { data: consents } = await medal.gdpr.getConsent('user@example.com');\n\n// Data exports\nconst { data: exp } = await medal.gdpr.requestExport();\nconst { data: exports } = await medal.gdpr.listExports();\nconst { data: status } = await medal.gdpr.getExport(exp.request_id);\nconsole.log(status.download_url); // available when status is 'completed'\n\n// Cookie consent (server-to-server, from your own backend).\n// `domain` must be one your workspace's registered sites vouch for, or the\n// call is refused with 403. Never call this from a browser — it uses your\n// workspace API key. Browser-side consent goes to /api/cookie-consent/public\n// with the site's public `pk_consent_*` key instead.\nawait medal.gdpr.cookieConsent({\n  event: 'preferences_saved',\n  consentId: 'CID-00001234',\n  domain: 'example.com',\n  categories: {\n    essential: true,\n    analytics: true,\n    marketing: false,\n    functional: true,\n  },\n  policyVersion: '2.1',\n});\n```\n\n### Scan\n\n```ts\n// Find the company in the Norwegian registry (typeahead)\nconst { data: hits } = await medal.scan.companies('Eksempel Bygg');\n\n// Queue a scan — exactly one of url / orgnr / name\nconst { data: job } = await medal.scan.create({ orgnr: hits[0].orgnr });\n\n// Poll until it settles (~30 s; done or failed)\nconst finished = await medal.scan.waitForResult(job.id);\nif (finished.status === 'done' && finished.result) {\n  console.log(finished.result.nettskaar, finished.result.subScores);\n}\n```\n\n### Helpdesk\n\n```ts\n// List/search conversations\nconst conversations = await medal.helpdesk.conversations.list({\n  status: 'open',                    // 'open' | 'snoozed' | 'closed'\n  assignee_user_id: 'user_1',\n  requester: 'jane@example.com',     // match visitor name/email\n  query: 'refund',                   // free-text search\n  channels: ['widget', 'whatsapp'],  // channel filter (the closed HelpdeskChannel set)\n  limit: 50,\n});\n\n// Triage: what has nobody picked up yet? `assigned: false` is the question\n// `assignee_user_id` cannot ask; `chat_type` narrows personal-account\n// channels (Telegram) to DMs, groups or broadcast channels.\nconst unowned = await medal.helpdesk.conversations.list({ assigned: false, chat_type: 'group' });\n\n// Read one conversation + its messages\nconst { data: conversation } = await medal.helpdesk.conversations.get('conv_id');\nconst messages = await medal.helpdesk.conversations.messages('conv_id', { limit: 50 });\n\n// Assign / snooze / close\nawait medal.helpdesk.conversations.update('conv_id', { assignee_user_id: 'user_1' });\nawait medal.helpdesk.conversations.update('conv_id', { status: 'closed', assignee_user_id: null });\n\n// Reply as an operator (see \"Helpdesk bridge\" below for idempotency)\nconst { data: reply } = await medal.helpdesk.replies.create(\n  {\n    conversation_id: 'conv_id',\n    body: 'Thanks for reaching out — on it!',\n    author_name: 'Support Bot',    // optional display name\n    message_type: 'chat',          // or 'note' for an internal note\n  },\n  { idempotencyKey: crypto.randomUUID() },\n);\n```\n\n**A `201` from `replies.create` means accepted, not delivered.** The channel hand-off happens asynchronously afterwards. Each message carries `delivery_status` (`pending` | `sent` | `delivered` | `failed`) and `delivery_error`, both `null` for inbound messages and internal notes (neither is ever sent to a channel):\n\n```ts\nconst { data: messages } = await medal.helpdesk.conversations.messages('conv_id');\nfor (const message of messages) {\n  if (message.delivery_status === 'failed') {\n    console.error(message.id, message.delivery_error);\n  }\n}\n```\n\nSubscribe to `helpdesk.message_delivery_updated` for the same values pushed instead of polled.\n\n**Upstream deletions.** When the customer deletes a message on the external channel (Telegram today), the message is kept as a *tombstone* so the thread still reads in order: `externally_deleted_at` carries the Unix-ms timestamp of the deletion, `body` is empty and any attachment has been erased. Mirror the deletion in your own store rather than treating it as a blank message; the push-side signal is the `helpdesk.message_deleted` webhook event, whose payload deliberately carries an empty body too.\n\n#### Linking a thread to a CRM contact\n\nA partner usually knows which external user is which customer, and Medal cannot\nderive it — Telegram exposes no e-mail, hides phone numbers, and usernames are\nmutable. So the link is yours to assert:\n\n```ts\n// Exactly one of contact_id or email; an email resolves through the CRM's own\n// find-or-create, so you do not have to pre-create contacts.\nconst { data: linked } = await medal.helpdesk.conversations.linkContact(conversationId, {\n  email: 'ida@example.no',\n});\nlinked.conversations_updated;  // the link is stored on the SENDER, so it reaches\n                               // their older threads too\nlinked.previous_contact_id;    // set when this replaced an existing link\n\n// Reversing a mistake is idempotent: a thread with no contact answers unlinked: false\nconst { data: unlinked } = await medal.helpdesk.conversations.unlinkContact(conversationId);\n```\n\nA group thread — or a channel with no stable sender — answers\n`422 CONVERSATION_NOT_LINKABLE`. Both routes are confirmable writes: a\ncapability-scoped credential needs an `X-Capability-Confirmation` (see below).\n\n### Webhooks\n\n```ts\n// Create an endpoint. The signing secret is returned EXACTLY ONCE — store it\n// securely immediately; you cannot retrieve it again.\nconst { data: endpoint } = await medal.webhooks.create(\n  {\n    name: 'Helpdesk bridge',\n    url: 'https://example.com/medal/webhook', // must be https\n    // Typed as SubscribableWebhookEventType[] — a typo is a compile error, not a runtime 400\n    event_types: ['helpdesk.message_received', 'helpdesk.conversation_status_changed'],\n    channels: ['widget'],                     // optional channel filter\n  },\n  { idempotencyKey: crypto.randomUUID() },\n);\nconsole.log(endpoint.secret); // whsec_… — shown only in this response\n\n// Manage endpoints\nconst { data: endpoints } = await medal.webhooks.list();\nconst { data: one } = await medal.webhooks.get(endpoint.id);\nawait medal.webhooks.update(endpoint.id, { enabled: false });\nawait medal.webhooks.delete(endpoint.id);\n\n// Observe deliveries + send a signed test event\nconst { data: deliveries } = await medal.webhooks.deliveries(endpoint.id, { limit: 20 });\nawait medal.webhooks.test(endpoint.id); // queues a 'test.ping' delivery\n```\n\nFailed deliveries retry with exponential backoff (up to 6 attempts) before being dead-lettered.\n\n`deliveries()` returns the most recent attempts only — it takes a `limit` and is **not** cursor-paginated. A delivery's `id` is the same value sent as the `X-Medal-Delivery-Id` and `Idempotency-Key` headers on the outbound request, so you can join your own receiving log to this listing exactly. Deliveries **never carry payload bodies** (payloads can contain customer PII); instead each one exposes correlation fields — `resource_id`, `conversation_id`, `message_id`, `connection_ref`, `channel`, `channel_connection_id` — that let you look the subject up through the regular API. All six are nullable and **fail closed to `null`** when no canonical event exists for the delivery (e.g. `test.ping` deliveries, or events that have aged out of retention), so always null-check them.\n\n### Channels (partner connect)\n\nMint hosted connect links that let an external person — e.g. a partner's operator, with no Medal account — attach a channel account (today `telegram_inbox`) to the workspace's helpdesk, then track and disconnect the resulting connections. Requires the `channel.connect.manage` scope; OAuth callers additionally need the workspace `admin` role for the writes.\n\n```ts\n// Mint a single-use hosted connect link. `data.url` carries the one-time link\n// token EXACTLY ONCE — an idempotent replay (same Idempotency-Key) omits it,\n// so store it immediately (or revoke and mint a new link if lost).\nconst { data: link } = await medal.channels.connectLinks.create(\n  {\n    channel_type: 'telegram_inbox',\n    label: 'Acme support',                              // shown on the hosted page\n    redirect_url: 'https://partner.example.com/done',   // optional, https only\n  },\n  { idempotencyKey: crypto.randomUUID() },\n);\nconsole.log(link.url); // send this to the person who should connect\n\n// Track links (tokens are never returned) and revoke unused ones\nconst { data: links } = await medal.channels.connectLinks.list({ status: 'pending' });\nawait medal.channels.connectLinks.revoke(link.id);\n\n// List the workspace's channel connections and disconnect one\nconst { data: connections } = await medal.channels.connections.list();\n// state: 'connecting' | 'active' | 'disconnected' | 'disabled'\nawait medal.channels.connections.disconnect(connections[0].id);\n\n// Both listings are cursor-paginated (limit defaults to 50, capped at 100)\nlet cursor: string | undefined;\ndo {\n  const page = await medal.channels.connections.list({ limit: 100, cursor });\n  for (const connection of page.data) console.log(connection.id, connection.state);\n  cursor = page.pagination.has_more ? page.pagination.next_cursor ?? undefined : undefined;\n} while (cursor);\n```\n\nFilters (`channel_type`, `status`) are applied **within** each page, so a page may hold fewer than `limit` items while `pagination.has_more` is still `true` — drive the loop off `has_more`, never off the item count.\n\nWhen the person completes the hosted sign-in, the link flips to `consumed` and your webhook endpoint receives `helpdesk.channel_connected` (subscribe via the Webhooks resource above); disconnects emit `helpdesk.channel_disconnected` with a `reason`. Inbound messages on the connected account then flow into the helpdesk — consume them via `helpdesk.message_received` and reply with `medal.helpdesk.replies.create`.\n\n### Capability confirmations\n\nMedal's confirmable write routes require **both** an `Idempotency-Key` and an `X-Capability-Confirmation` token whenever the calling credential holds the capability scope *directly* — which is the case for every correctly-scoped partner key and OAuth grant. (API keys carrying only legacy scopes are exempt.) Affected routes and their capability ids:\n\n| Capability id | Route | SDK method |\n|---|---|---|\n| `channel.connect_link.create.execute` | `POST /api/v1/channels/connect-links` | `channels.connectLinks.create` |\n| `channel.connect_link.revoke.execute` | `DELETE /api/v1/channels/connect-links/{id}` | `channels.connectLinks.revoke` |\n| `channel.connection.disconnect.execute` | `DELETE /api/v1/channels/connections/{id}` | `channels.connections.disconnect` |\n| `compliance.gdpr.export.execute` | `POST /api/v1/gdpr/export` | `gdpr.requestExport` |\n| `content.post.draft.create` | `POST /api/v1/posts` | `posts.create` |\n| `content.post.publish.execute` | `POST /api/v1/posts/{id}/publish` | `posts.publish` |\n| `content.post.schedule.execute` | `POST /api/v1/posts/{id}/schedule` | `posts.schedule` |\n| `crm.contact.note.create.execute` | `POST /api/v1/contacts/{id}/notes` | `contacts.addNote` |\n| `deals.deal.create.execute` | `POST /api/v1/deals` | `deals.create` |\n| `deals.deal.update.execute` | `PATCH /api/v1/deals/{id}` | `deals.update` |\n| `email.campaign.send.execute` | `POST /api/v1/emails` **and** `POST /api/v1/emails/batch` | `emails.send`, `emails.batch` |\n| `helpdesk.conversation.link_contact.execute` | `PUT /api/v1/helpdesk/conversations/{id}/contact` | `helpdesk.conversations.linkContact` |\n| `helpdesk.conversation.reply.execute` | `POST /api/v1/helpdesk/replies` | `helpdesk.replies.create` |\n| `helpdesk.conversation.unlink_contact.execute` | `DELETE /api/v1/helpdesk/conversations/{id}/contact` | `helpdesk.conversations.unlinkContact` |\n| `helpdesk.conversation.update.execute` | `PATCH /api/v1/helpdesk/conversations/{id}` | `helpdesk.conversations.update` |\n| `helpdesk.webhook.create.execute` | `POST /api/v1/webhooks` | `webhooks.create` |\n| `helpdesk.webhook.update.execute` | `PATCH /api/v1/webhooks/{id}` | `webhooks.update` |\n| `helpdesk.webhook.delete.execute` | `DELETE /api/v1/webhooks/{id}` | `webhooks.delete` |\n\n`CAPABILITY_IDS` (a typed union via `CapabilityId`) and `CAPABILITY_ROUTES` cover\nthose **and** the confirmable API capabilities this SDK has no method for yet —\n`ai.text.generate`, `channel.telegram_sync_config.update.execute`,\n`content.post.media.attach.execute`, `email.draft.create.execute`,\n`flows.enrollment.create.execute`, `image.generation.execute`,\n`media.generated_asset.save.execute` and the two `site.sanity.document.*` ids.\nThey are valid input to `medal.capabilityConfirmations.create(...)`, so a route\nyou call with `fetch` can still be confirmed through the SDK.\n\nTwo ids map to **more than one route** (`email.campaign.send.execute` and\n`ai.text.generate`). The mint refuses those without an explicit `api_path`\n(`400 CAPABILITY_API_PATH_REQUIRED`) — the SDK sends it for you, and\n`CAPABILITY_ROUTES[id].alternate_path_templates` names the others.\n\n#### Explicit flow\n\n```ts\nconst idempotencyKey = crypto.randomUUID();\n\nconst { data: confirmation } = await medal.capabilityConfirmations.create({\n  capability_id: 'channel.connect_link.create.execute',\n  idempotency_key: idempotencyKey,   // the token is bound to this exact key\n  preview_summary: 'Mint a Telegram connect link for Acme Support',\n  user_approved: true,               // a human on your side approved this action\n});\n\nconst { data: link } = await medal.channels.connectLinks.create(\n  { channel_type: 'telegram_inbox', label: 'Acme Support' },\n  { idempotencyKey, capabilityConfirmation: confirmation.confirmation_token },\n);\n```\n\nFor an id-bound route, pass `path_params` so the token binds to the concrete path:\n\n```ts\nconst { data: confirmation } = await medal.capabilityConfirmations.create({\n  capability_id: 'channel.connection.disconnect.execute',\n  path_params: { id: connectionId },\n  idempotency_key: idempotencyKey,\n  preview_summary: `Disconnect ${connectionId} — approved by ${operator.email}`,\n  user_approved: true,\n});\n\nawait medal.channels.connections.disconnect(connectionId, {\n  idempotencyKey,\n  capabilityConfirmation: confirmation.confirmation_token,\n});\n```\n\nTokens expire within 15 minutes and are single-purpose: bound to the workspace, the auth subject, the method + path, the capability's required scopes, and the idempotency key.\n\n#### Auto-confirm (opt-in, off by default)\n\nIf your integration already gates these writes behind a real human approval, let the SDK mint both halves for you:\n\n```ts\nconst medal = new Medal(process.env.MEDAL_API_KEY, {\n  autoConfirmCapabilities: {\n    previewSummary: (ctx) => {\n      // `ctx` is a discriminated union on `capabilityId` — narrowing gives you\n      // the exact request payload type, so the summary can describe the\n      // specific action rather than just the route.\n      switch (ctx.capabilityId) {\n        case 'channel.connect_link.create.execute':\n          return `${operator.email} approved a ${ctx.body.channel_type} connect link for \"${ctx.body.label}\"`;\n        case 'helpdesk.conversation.reply.execute':\n          return `${operator.email} approved replying to ${ctx.body.conversation_id}: \"${ctx.body.body}\"`;\n        default:\n          // DELETE routes have no body; identify them by path instead.\n          return `${operator.email} approved ${ctx.method} ${ctx.path}`;\n      }\n    },\n  },\n});\n\n// Both headers are minted and attached automatically.\nconst { data: link } = await medal.channels.connectLinks.create({\n  channel_type: 'telegram_inbox',\n  label: 'Acme Support',\n});\n```\n\nThe callback receives `{ capabilityId, method, path, pathParams, idempotencyKey, body }`. `body` is the exact object you passed to the SDK method, by reference and unmodified — treat it as read-only, since mutating it would change what is actually sent. Prefer a payload-aware summary: `\"Reply to conv_1: 'Refund issued'\"` is an audit record, `\"POST /api/v1/helpdesk/replies\"` is not. The server caps `preview_summary` at 4000 characters, so summarise the payload rather than serialising it wholesale.\n\n> **Read before enabling.** Every minted token carries `user_approved: true`, which asserts to Medal that *a human on your side approved that specific action*, and the `previewSummary` you return is retained as the audit record of what they approved. Enable it only on code paths where that is genuinely true — never to rubber-stamp unattended writes. Returning a blank summary throws rather than asserting an approval with no description.\n\nPer-call control:\n\n```ts\n// Opt in for one call only (client default stays off)\nawait medal.webhooks.delete(endpointId, {\n  autoConfirm: { previewSummary: () => `${operator.email} approved removing ${endpointId}` },\n});\n\n// Opt out of a client-level default for one call\nawait medal.webhooks.delete(endpointId, { autoConfirm: false });\n```\n\nAuto-confirm never overrides what you supply: if a call already carries both `idempotencyKey` and `capabilityConfirmation`, nothing is minted. If it carries only `idempotencyKey`, that key is reused when binding the token.\n\nAuto-confirm reaches every resource that owns a confirmable route: `channels`,\n`helpdesk`, `webhooks`, `contacts`, `deals`, `emails`, `gdpr` and `posts`. (It\nused to be wired into only the first three, so a capability-scoped key calling\n`deals.update` got a `428` with no way to satisfy it.)\n\n### Workspaces\n\n```ts\nconst { data: workspaces } = await medal.workspaces.list();\nconsole.log(workspaces); // [{ id, name, slug }]\n```\n\n## Naming\n\n`remove` and `delete` are aliases wherever both read naturally —\n`contacts.remove(id)` / `contacts.delete(id)`, `deals`, `posts`, `webhooks`,\n`bookings.events` — and the domain verbs keep a `delete` alias too\n(`channels.connectLinks.revoke` / `.delete`,\n`channels.connections.disconnect` / `.delete`). Pick whichever reads better at\nthe call site; they are the same request.\n\nThe bookings catalogue is available both ways for the same reason:\n`bookings.services.list()` ≡ `bookings.listServices()`, and\n`bookings.resources.list()` ≡ `bookings.listResources()`.\n\nEvery write takes an optional trailing `options` (`RequestOptions`): an\n`idempotencyKey`, a `capabilityConfirmation`, `autoConfirm`, `retry: false`,\nextra `headers`, or a `signal`.\n\n## Helpdesk bridge\n\nBuild a two-way bridge: receive helpdesk events on a webhook, and reply through the API.\n\nEvery delivery is signed. The `X-Medal-Signature` header carries `sha256=<base64(HMAC-SHA256(\"{timestamp}.{rawBody}\", secret))>`, where `timestamp` is the `X-Medal-Timestamp` header (Unix ms). Use `verifyWebhookSignature` to authenticate the delivery and get a fully typed event back — it recomputes the HMAC with Web Crypto, so it runs on Node.js, Deno, Bun and Cloudflare Workers alike and rejects stale timestamps (default tolerance 5 minutes).\n\n```ts\nimport { Medal, verifyWebhookSignature, WebhookVerificationError } from '@medalsocial/sdk';\n\nconst medal = new Medal(process.env.MEDAL_API_KEY);\n\n// Example: a fetch-style handler (Cloudflare Workers, Hono, Next.js route, …).\n// IMPORTANT: verify against the RAW body string — do not JSON.parse first.\nexport async function handleWebhook(request: Request): Promise<Response> {\n  const payload = await request.text();\n\n  let event;\n  try {\n    event = await verifyWebhookSignature({\n      payload,\n      timestamp: request.headers.get('X-Medal-Timestamp') ?? '',\n      signature: request.headers.get('X-Medal-Signature') ?? '',\n      secret: process.env.MEDAL_WEBHOOK_SECRET, // the whsec_… from webhooks.create\n    });\n  } catch (err) {\n    if (err instanceof WebhookVerificationError) {\n      return new Response(`Invalid webhook: ${err.code}`, { status: 401 });\n    }\n    throw err;\n  }\n\n  switch (event.type) {\n    case 'helpdesk.message_received': {\n      const { conversation, message } = event.data;\n      // Reply with an idempotency key so retried deliveries never double-post.\n      // The X-Medal-Delivery-Id header (== event.id) is a perfect key.\n      await medal.helpdesk.replies.create(\n        {\n          conversation_id: conversation.id,\n          body: `Thanks! We received: \"${message.body}\"`,\n          author_name: 'Bridge Bot',\n        },\n        { idempotencyKey: `reply:${event.id}` },\n      );\n      break;\n    }\n    case 'helpdesk.conversation_status_changed':\n      console.log(event.data.previousStatus, '→', event.data.status);\n      break;\n    case 'helpdesk.conversation_assigned':\n      console.log('assigned to', event.data.assigneeUserId);\n      break;\n    case 'test.ping':\n      break; // sent by medal.webhooks.test()\n  }\n\n  return new Response('ok', { status: 200 }); // 2xx acknowledges the delivery\n}\n```\n\nEvent types: `helpdesk.conversation_created`, `helpdesk.conversation_assigned`, `helpdesk.conversation_status_changed`, `helpdesk.message_received`, `helpdesk.message_sent`, `helpdesk.message_delivery_updated`, `helpdesk.channel_connected`, `helpdesk.channel_disconnected`, and `test.ping`. All are discriminated on `event.type` — TypeScript narrows `event.data` automatically in a `switch`.\n\nChannel lifecycle events (`helpdesk.channel_connected` / `helpdesk.channel_disconnected`) fire when a channel account is attached to or removed from the workspace — e.g. via a partner connect link (see the Channels resource above). Their `data` is channel-generic: `channel`, `channelConnectionId`, `channel_type`, `connection_ref`, `label`, `masked_identity`, and (disconnect only) `reason` — one of `api_disconnect`, `user_revoked`, `member_disconnect`.\n\nNotes:\n\n- **Idempotency**: deliveries are retried on failure, so make your handler idempotent. Deduplicate on `event.id` (also sent as the `X-Medal-Delivery-Id` and `Idempotency-Key` request headers). When replying via `medal.helpdesk.replies.create`, always pass an `idempotencyKey` — it is required for capability-scoped tokens.\n- **Respond fast**: return a 2xx within 10 seconds; do slow work asynchronously.\n- **Secret handling**: the endpoint secret is returned only by `webhooks.create`. If lost, delete the endpoint and create a new one.\n\n## Error Handling\n\nA call can fail three ways, and each has a type:\n\n| Class | `code` | When |\n|-------|--------|------|\n| `MedalApiError` | the API's `error.code` | The API answered with a 4xx/5xx |\n| `MedalTimeoutError` | `TIMEOUT` | The per-attempt deadline elapsed |\n| `MedalNetworkError` | `NETWORK` | The request never produced a response (DNS, TLS, reset, offline) |\n\nAll three extend `MedalError`, so one clause covers every failure the SDK\nraises. Cancelling through your own `AbortSignal` is *not* one of them — that\nrejects with your abort reason, unchanged.\n\n```ts\nimport { Medal, MedalApiError, MedalError, MedalTimeoutError } from '@medalsocial/sdk';\n\ntry {\n  await medal.contacts.get('bad_id');\n} catch (err) {\n  if (err instanceof MedalApiError) {\n    console.log(err.status);       // 404\n    console.log(err.code);         // 'NOT_FOUND' — a MedalErrorCode\n    console.log(err.message);      // 'Contact not found'\n    console.log(err.details);      // field-level validation errors (if any)\n    console.log(err.requestId);    // 'req_…' from X-Request-ID — quote this to support\n    console.log(err.retryAfterMs); // 42000 on a 429, else null\n  } else if (err instanceof MedalTimeoutError) {\n    console.log(err.timeoutMs);\n  } else if (err instanceof MedalError) {\n    console.log(err.code);         // 'NETWORK'\n  }\n}\n```\n\nBranch on `code`, never on `message`: the message is prose, the code is the\ncontract. `MedalErrorCode` is exported as a union of the codes the API throws\ntoday (`IDEMPOTENCY_IN_PROGRESS`, `CAPABILITY_CONFIRMATION_REQUIRED`,\n`PORTAL_CODE_INVALID`, `INVALID_RETURN_URL`, …) widened with `string`, so a code\nMedal adds later still type-checks — treat an unknown one as a generic failure\nof its HTTP status. The full list also ships in the OpenAPI document as\n`x-medal-error-codes`.\n\n## Retries\n\n`429` and `5xx` are retried up to 3 attempts, and so is a network failure on a\nrequest that is safe to repeat — a `GET`, or a write that carries an\n`Idempotency-Key` (every `create`, `send`, `publish`, `schedule` and booking\naction mints one). An unkeyed `POST` is sent exactly once: \"the connection\ndropped\" says nothing about whether the write committed.\n\nThe wait between attempts is a server-specified `Retry-After` when there is one\n(both wire forms: delay-seconds and HTTP-date), otherwise an exponential backoff\n— 250 ms, then 500 ms — spread ±25% so a fleet knocked back by one 503 does not\nreturn in lock-step.\n\nPass `{ retry: false }` on a call whose first attempt may have succeeded even\nthough the response was lost (a one-time code, a logout, an erasure).\n\n### Cancelling\n\nEvery method takes an optional `signal`, merged with the client's own timeout.\nIt also interrupts a retry that is waiting out its backoff, so an abandoned call\nstops costing time immediately:\n\n```ts\nconst controller = new AbortController();\nconst page = medal.contacts.list({ status: 'lead' }, { signal: controller.signal });\n// …user navigated away\ncontroller.abort();\n```\n\n## Rate Limits\n\nEvery bucket is keyed **per credential** (per API key, or per OAuth user), and\nthey are separate buckets: a busy return page cannot starve the salon's own\nstaff reads. A `429` carries `Retry-After`, which the SDK honours automatically\nand also exposes as `MedalApiError.retryAfterMs`.\n\n| Bucket | Routes | Rate | Burst |\n|--------|--------|------|-------|\n| `apiRead` | every `GET` not listed below | 300/min | 100 |\n| `apiWrite` | every `POST` / `PATCH` / `PUT` / `DELETE` not listed below | 60/min | 30 |\n| `apiEmailSend` | `POST /emails` | 100/min | 50 |\n| `apiEmailBatch` | `POST /emails/batch` | 10/min | 5 |\n| `apiImport` | `POST /contacts/import` | 5/min | 3 |\n| `apiGdprExport` | `POST /gdpr/export` | 5/hour | 2 |\n| `apiScanRequest` | `POST /scan` (front door) | 120/min | 60 |\n| `apiScanCreate` | `POST /scan` (charged only when a crawl really starts) | 15/min | 30 |\n| `apiScanRead` | `GET /scan/{id}`, `GET /scan/companies` | 1200/min | 300 |\n| `apiBookingPoll` | `GET /bookings/manage/{token}/payment` | 600/min | 200 |\n| `apiPortalLoginStart` | `POST /portal/login/start` | 60/min | 20 |\n| `apiPortalLoginVerify` | `POST /portal/login/verify` | 60/min | 20 |\n| `apiPortalVippsStart` | `POST /portal/vipps/start` | 60/min | 20 |\n| `apiPortalVippsExchange` | `POST /portal/vipps/exchange` | 60/min | 20 |\n| `apiPortalVippsCallback` | `GET /portal/vipps/callback` (browser, keyed per client IP) | 300/min | 100 |\n| `apiPortalExport` | `POST /portal/me/export` | 60/hour | 10 |\n| `apiConnectLinkMint` | `POST /channels/connect-links` | 10/hour | 5 |\n| `apiCookieConsent` | `POST /api/cookie-consent` | 600/min | 1200 |\n| `oauthIntrospect` | OAuth token introspection | 600/min | 200 |\n\nThe customer-facing buckets (`apiBookingPoll`, `apiPortal*`, `apiScan*`) are\nkeyed per API key too — and one site key serves every visitor — so they bound\nthe **site's aggregate** volume, not one visitor's. `apiBookingPoll` is why\n`bookings.manage.payment.waitForSettlement(...)` polls once a second by default\nwhile the booking-id twin waits 2.5 s on the shared `apiRead` bucket.\n\n### Scopes and role floors\n\nA scope says what a credential may do; an OAuth credential additionally inherits\nthe **workspace role of the user who granted it**, and some routes refuse below a\nfloor. A workspace API key is an admin-minted credential and is never held to the\nrole floor.\n\n| Surface | Scope | OAuth role floor |\n|---------|-------|------------------|\n| Posts, contacts, deals, e-mails, bookings, helpdesk reads/replies | the route's own `*.read` / `*.manage` scope | member |\n| `webhooks.*` (read and write) | `helpdesk.webhook.manage` | **admin** |\n| `channels.connectLinks.*`, `channels.connections.disconnect` | `channel.connect.manage` | **admin** |\n| `bookings.events.remove` | `write:bookings` | **admin** |\n| `gdpr.requestExport`, `gdpr.listExports`, `gdpr.getExport` | `compliance.gdpr.export` | **owner** |\n\nA credential below the floor answers `403 FORBIDDEN`.\n\n## Pagination\n\nMost list endpoints have an `iter()` twin that walks the pages for you:\n\n```ts\nfor await (const contact of medal.contacts.iter({ status: 'lead' })) {\n  await sync(contact);\n}\n```\n\n`iter()` exists on `contacts`, `deals`, `posts`, `helpdesk.conversations`,\n`channels.connectLinks` and `channels.connections`. Pages are fetched lazily —\n`break` and the next one is never requested — and the loop is driven off\n`pagination.has_more`, which matters because several filters are applied\n**within** a page: a page can hold fewer rows than `limit`, or none at all,\nwhile more pages remain. A hand-rolled loop that stops on a short page silently\ndrops the rest.\n\n`list()` is unchanged if you want the raw page:\n\n```ts\nlet cursor: string | undefined;\ndo {\n  const page = await medal.contacts.list({ limit: 100, cursor });\n  console.log(page.data);\n  cursor = page.pagination.next_cursor ?? undefined;\n} while (cursor);\n```\n\n`bookings.list()` deliberately has no `iter()`: its page also carries\n`pagination.truncated`, which says matching bookings exist that **no cursor\nreaches** (narrow `from_ts` / `to_ts`), and an iterator would hide that.\n\nUse `paginate(fetchPage)` — exported from the package — to get the same walk over\nany paginated call the SDK does not wrap yet.\n\n## OpenAPI 3.1\n\nThe SDK publishes a validated OpenAPI 3.1 contract for the API surface covered by the typed client.\n\n```ts\nimport type { OpenApiComponents, OpenApiOperations, OpenApiPaths } from '@medalsocial/sdk';\nimport type { paths } from '@medalsocial/sdk/openapi-types';\n```\n\nPackage artifacts:\n\n- `@medalsocial/sdk/openapi.yaml` - source OpenAPI 3.1 YAML document\n- `@medalsocial/sdk/openapi.json` - bundled JSON document generated during build\n- `@medalsocial/sdk/openapi-types` - generated TypeScript contract types\n\nValidate the contract locally:\n\n```bash\npnpm openapi:check\n```\n\n## Runtime Support\n\nNode.js 22+ (see `engines.node`; the unit suite runs on 22 and 24 in CI) and modern browsers. Uses native `fetch` — no polyfills required. The client itself only needs `fetch`, `AbortController`, `WritableStream` and Web Crypto, but Node 20 reached end-of-life in April 2026 and the SDK's own toolchain (pnpm 11, `changesets`, `secretlint`, `lint-staged`) needs 22.13+, so 22 is the floor the SDK certifies.\n\nThe individual helpers only need Web Crypto and `fetch`, so they also run on Deno, Bun and Cloudflare Workers.\n\n## License\n\nApache-2.0\n","readmeFilename":""}