@officexapp/vidfarm-devcli 0.21.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/dollarplatoon-skill/SKILL.md +1227 -0
- package/.agents/skills/editor-capabilities/SKILL.md +182 -0
- package/.agents/skills/editor-capabilities/references/re-theme-walkthrough.md +58 -0
- package/.agents/skills/embedded-captions/CATALOG.md +93 -0
- package/.agents/skills/embedded-captions/SKILL.md +286 -0
- package/.agents/skills/embedded-captions/assets/brand/CDPR-fankit-terms.txt +35 -0
- package/.agents/skills/embedded-captions/assets/brand/cyberpunk-widths.json +115 -0
- package/.agents/skills/embedded-captions/assets/fonts/char-widths.json +2211 -0
- package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +242 -0
- package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +242 -0
- package/.agents/skills/embedded-captions/dna/README.md +148 -0
- package/.agents/skills/embedded-captions/dna/chrome.json +68 -0
- package/.agents/skills/embedded-captions/dna/cream.json +69 -0
- package/.agents/skills/embedded-captions/dna/documentary.json +62 -0
- package/.agents/skills/embedded-captions/dna/editorial.json +70 -0
- package/.agents/skills/embedded-captions/dna/glitch.json +82 -0
- package/.agents/skills/embedded-captions/dna/ink.json +65 -0
- package/.agents/skills/embedded-captions/dna/keynote.json +62 -0
- package/.agents/skills/embedded-captions/dna/loud.json +75 -0
- package/.agents/skills/embedded-captions/dna/neon.json +58 -0
- package/.agents/skills/embedded-captions/dna/velocity.json +89 -0
- package/.agents/skills/embedded-captions/modes/cinematic/README.md +48 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +98 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +188 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +134 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +179 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +81 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +170 -0
- package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +16 -0
- package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +226 -0
- package/.agents/skills/embedded-captions/modes/cinematic/engine.html +355 -0
- package/.agents/skills/embedded-captions/modes/standard/_anatomy.md +233 -0
- package/.agents/skills/embedded-captions/modes/standard/_motion.md +192 -0
- package/.agents/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs +97 -0
- package/.agents/skills/embedded-captions/references/aesthetic-principles.md +168 -0
- package/.agents/skills/embedded-captions/references/anti-patterns.md +188 -0
- package/.agents/skills/embedded-captions/references/bespoke-vs-presets.md +178 -0
- package/.agents/skills/embedded-captions/references/caption-grouping.md +130 -0
- package/.agents/skills/embedded-captions/references/composition-craft.md +522 -0
- package/.agents/skills/embedded-captions/references/direction-catalog.md +138 -0
- package/.agents/skills/embedded-captions/references/example-renders/champion.html +371 -0
- package/.agents/skills/embedded-captions/references/example-renders/memory-wall.html +334 -0
- package/.agents/skills/embedded-captions/references/failure-modes.md +145 -0
- package/.agents/skills/embedded-captions/references/layout-heuristics.md +238 -0
- package/.agents/skills/embedded-captions/references/motion-vocabulary.md +148 -0
- package/.agents/skills/embedded-captions/references/rail.md +68 -0
- package/.agents/skills/embedded-captions/references/reference-bar.md +47 -0
- package/.agents/skills/embedded-captions/references/scene-types.md +94 -0
- package/.agents/skills/embedded-captions/references/test-set.md +66 -0
- package/.agents/skills/embedded-captions/references/typographic-moves.md +266 -0
- package/.agents/skills/embedded-captions/references/typography-presets.md +63 -0
- package/.agents/skills/embedded-captions/scripts/audio-envelope.cjs +95 -0
- package/.agents/skills/embedded-captions/scripts/check-occlusion.cjs +250 -0
- package/.agents/skills/embedded-captions/scripts/check-overflow.cjs +194 -0
- package/.agents/skills/embedded-captions/scripts/check-rail-climax.cjs +233 -0
- package/.agents/skills/embedded-captions/scripts/check-timing.cjs +173 -0
- package/.agents/skills/embedded-captions/scripts/fill-timings.cjs +124 -0
- package/.agents/skills/embedded-captions/scripts/fit-fonts.cjs +158 -0
- package/.agents/skills/embedded-captions/scripts/gen-stroke-path.py +46 -0
- package/.agents/skills/embedded-captions/scripts/inject-fonts.cjs +169 -0
- package/.agents/skills/embedded-captions/scripts/lib-dna.cjs +201 -0
- package/.agents/skills/embedded-captions/scripts/make-cinematic.cjs +1205 -0
- package/.agents/skills/embedded-captions/scripts/make-composition.cjs +404 -0
- package/.agents/skills/embedded-captions/scripts/make-theme.cjs +8781 -0
- package/.agents/skills/embedded-captions/scripts/matte.cjs +294 -0
- package/.agents/skills/embedded-captions/scripts/measure-layout.cjs +293 -0
- package/.agents/skills/embedded-captions/scripts/prepare.sh +39 -0
- package/.agents/skills/embedded-captions/scripts/preview-frames.cjs +268 -0
- package/.agents/skills/embedded-captions/scripts/render-and-composite.sh +509 -0
- package/.agents/skills/embedded-captions/scripts/render-theme.sh +34 -0
- package/.agents/skills/embedded-captions/scripts/safe-zones.cjs +813 -0
- package/.agents/skills/embedded-captions/scripts/transcribe.cjs +349 -0
- package/.agents/skills/embedded-captions/themes/PORTING.md +49 -0
- package/.agents/skills/embedded-captions/themes/README.md +244 -0
- package/.agents/skills/embedded-captions/themes/anchor.json +27 -0
- package/.agents/skills/embedded-captions/themes/arcade.json +51 -0
- package/.agents/skills/embedded-captions/themes/aurora.json +41 -0
- package/.agents/skills/embedded-captions/themes/biolume.json +35 -0
- package/.agents/skills/embedded-captions/themes/brush.json +74 -0
- package/.agents/skills/embedded-captions/themes/chalkboard.json +52 -0
- package/.agents/skills/embedded-captions/themes/dossier.json +56 -0
- package/.agents/skills/embedded-captions/themes/graffiti.json +62 -0
- package/.agents/skills/embedded-captions/themes/hologram.json +41 -0
- package/.agents/skills/embedded-captions/themes/inkwater.json +43 -0
- package/.agents/skills/embedded-captions/themes/laser.json +46 -0
- package/.agents/skills/embedded-captions/themes/lastpage.json +33 -0
- package/.agents/skills/embedded-captions/themes/neonsign.json +53 -0
- package/.agents/skills/embedded-captions/themes/nightcity.json +56 -0
- package/.agents/skills/embedded-captions/themes/ordnance.json +54 -0
- package/.agents/skills/embedded-captions/themes/papercut.json +37 -0
- package/.agents/skills/embedded-captions/themes/popup.json +46 -0
- package/.agents/skills/embedded-captions/themes/ransom.json +62 -0
- package/.agents/skills/embedded-captions/themes/scoreboard.json +54 -0
- package/.agents/skills/embedded-captions/themes/spectrum.json +46 -0
- package/.agents/skills/embedded-captions/themes/stardust.json +29 -0
- package/.agents/skills/embedded-captions/themes/stomp.json +43 -0
- package/.agents/skills/embedded-captions/themes/terminal.json +49 -0
- package/.agents/skills/embedded-captions/themes/thunder.json +44 -0
- package/.agents/skills/embedded-captions/themes/transit.json +44 -0
- package/.agents/skills/embedded-captions/themes/vhs.json +47 -0
- package/.agents/skills/faceless-explainer/SKILL.md +209 -0
- package/.agents/skills/faceless-explainer/references/cut-catalog.md +215 -0
- package/.agents/skills/faceless-explainer/references/motion-language.md +156 -0
- package/.agents/skills/faceless-explainer/references/story-design.md +248 -0
- package/.agents/skills/faceless-explainer/references/visual-design.md +146 -0
- package/.agents/skills/faceless-explainer/scripts/assemble-index.mjs +570 -0
- package/.agents/skills/faceless-explainer/scripts/audio.mjs +260 -0
- package/.agents/skills/faceless-explainer/scripts/build-frame.mjs +536 -0
- package/.agents/skills/faceless-explainer/scripts/captions.mjs +508 -0
- package/.agents/skills/faceless-explainer/scripts/lib/assets.mjs +55 -0
- package/.agents/skills/faceless-explainer/scripts/lib/dimensions.mjs +45 -0
- package/.agents/skills/faceless-explainer/scripts/lib/storyboard.mjs +249 -0
- package/.agents/skills/faceless-explainer/scripts/lib/tokens.mjs +204 -0
- package/.agents/skills/faceless-explainer/scripts/lib/transition-registry.mjs +38 -0
- package/.agents/skills/faceless-explainer/scripts/lib/transitions.json +71 -0
- package/.agents/skills/faceless-explainer/scripts/transitions.mjs +320 -0
- package/.agents/skills/faceless-explainer/sub-agents/frame-worker.md +75 -0
- package/.agents/skills/farmville-saas-ux/SKILL.md +156 -0
- package/.agents/skills/farmville-saas-ux/assets/starter.html +294 -0
- package/.agents/skills/farmville-saas-ux/references/components.md +340 -0
- package/.agents/skills/farmville-saas-ux/references/porting-guide.md +121 -0
- package/.agents/skills/farmville-saas-ux/references/tokens.md +271 -0
- package/.agents/skills/flockposter/LICENSE +17 -0
- package/.agents/skills/flockposter/README.md +72 -0
- package/.agents/skills/flockposter/SKILL.md +562 -0
- package/.agents/skills/flockposter/examples/cli-instagram-reel.sh +21 -0
- package/.agents/skills/flockposter/examples/cli-multi-platform.json +69 -0
- package/.agents/skills/flockposter/examples/cli-tiktok-upload-only.sh +22 -0
- package/.agents/skills/flockposter/examples/cli-x-thread.sh +17 -0
- package/.agents/skills/flockposter/examples/cli-youtube-short.sh +21 -0
- package/.agents/skills/flockposter/examples/public-api-instagram-reel.json +28 -0
- package/.agents/skills/general-video/SKILL.md +143 -0
- package/.agents/skills/hyperframes/SKILL.md +160 -0
- package/.agents/skills/hyperframes-animation/SKILL.md +84 -0
- package/.agents/skills/hyperframes-animation/adapters/animate-text.md +64 -0
- package/.agents/skills/hyperframes-animation/adapters/animejs.md +114 -0
- package/.agents/skills/hyperframes-animation/adapters/css-animations.md +143 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-easing-and-stagger.md +118 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-timeline-and-labels.md +96 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-transforms-and-perf.md +96 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap.md +105 -0
- package/.agents/skills/hyperframes-animation/adapters/html-in-canvas-patterns.md +507 -0
- package/.agents/skills/hyperframes-animation/adapters/lottie.md +117 -0
- package/.agents/skills/hyperframes-animation/adapters/three.md +131 -0
- package/.agents/skills/hyperframes-animation/adapters/typegpu.md +178 -0
- package/.agents/skills/hyperframes-animation/adapters/waapi.md +101 -0
- package/.agents/skills/hyperframes-animation/blueprints/comparison-split.md +27 -0
- package/.agents/skills/hyperframes-animation/blueprints/constellation-hub.md +44 -0
- package/.agents/skills/hyperframes-animation/blueprints/cta-morph-press.md +28 -0
- package/.agents/skills/hyperframes-animation/blueprints/cursor-ui-demo.md +57 -0
- package/.agents/skills/hyperframes-animation/blueprints/dataviz-countup.md +46 -0
- package/.agents/skills/hyperframes-animation/blueprints/device-surface-showcase.md +53 -0
- package/.agents/skills/hyperframes-animation/blueprints/grid-card-assemble.md +66 -0
- package/.agents/skills/hyperframes-animation/blueprints/kinetic-type-beats.md +78 -0
- package/.agents/skills/hyperframes-animation/blueprints/logo-assemble-lockup.md +69 -0
- package/.agents/skills/hyperframes-animation/blueprints/overwhelm-surround.md +28 -0
- package/.agents/skills/hyperframes-animation/blueprints/spatial-pan-stations.md +37 -0
- package/.agents/skills/hyperframes-animation/blueprints/ticker-takeover.md +29 -0
- package/.agents/skills/hyperframes-animation/blueprints/titlecard-reveal.md +42 -0
- package/.agents/skills/hyperframes-animation/blueprints/typewriter-reveal.md +51 -0
- package/.agents/skills/hyperframes-animation/blueprints/video-text-pivot.md +30 -0
- package/.agents/skills/hyperframes-animation/blueprints-index.md +146 -0
- package/.agents/skills/hyperframes-animation/examples/assets/avatars/02.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/github.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/nvidia.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/visa.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/zoominfo.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/brand-reveal-assemble-zoom.html +382 -0
- package/.agents/skills/hyperframes-animation/examples/comparison-split-cards.html +649 -0
- package/.agents/skills/hyperframes-animation/examples/concept-demo-decode-pan.html +520 -0
- package/.agents/skills/hyperframes-animation/examples/cta-morph-press.html +468 -0
- package/.agents/skills/hyperframes-animation/examples/cta-orbit-collapse.html +1298 -0
- package/.agents/skills/hyperframes-animation/examples/demo-page-scroll-spotlight.html +759 -0
- package/.agents/skills/hyperframes-animation/examples/hook-counter-burst.html +729 -0
- package/.agents/skills/hyperframes-animation/examples/messaging-multi-phrase.html +352 -0
- package/.agents/skills/hyperframes-animation/examples/metric-video-text-pivot.html +779 -0
- package/.agents/skills/hyperframes-animation/examples/problem-mockup-overwhelm.html +1374 -0
- package/.agents/skills/hyperframes-animation/examples/proof-logo-chain.html +861 -0
- package/.agents/skills/hyperframes-animation/examples/takeover-ticker-displace.html +347 -0
- package/.agents/skills/hyperframes-animation/examples/workflow-approve-press.html +606 -0
- package/.agents/skills/hyperframes-animation/rules/3d-page-scroll.md +227 -0
- package/.agents/skills/hyperframes-animation/rules/3d-text-depth-layers.md +297 -0
- package/.agents/skills/hyperframes-animation/rules/ai-tracking-box.md +382 -0
- package/.agents/skills/hyperframes-animation/rules/ambient-glow-bloom.md +305 -0
- package/.agents/skills/hyperframes-animation/rules/asr-keyword-glow.md +286 -0
- package/.agents/skills/hyperframes-animation/rules/avatar-cloud-network.md +371 -0
- package/.agents/skills/hyperframes-animation/rules/camera-cursor-tracking.md +246 -0
- package/.agents/skills/hyperframes-animation/rules/card-morph-anchor.md +267 -0
- package/.agents/skills/hyperframes-animation/rules/center-outward-expansion.md +227 -0
- package/.agents/skills/hyperframes-animation/rules/context-sensitive-cursor.md +257 -0
- package/.agents/skills/hyperframes-animation/rules/coordinate-target-zoom.md +332 -0
- package/.agents/skills/hyperframes-animation/rules/counting-dynamic-scale.md +283 -0
- package/.agents/skills/hyperframes-animation/rules/css-marker-patterns.md +373 -0
- package/.agents/skills/hyperframes-animation/rules/cursor-click-ripple.md +262 -0
- package/.agents/skills/hyperframes-animation/rules/depth-of-field-blur.md +313 -0
- package/.agents/skills/hyperframes-animation/rules/depth-scatter-assemble.md +303 -0
- package/.agents/skills/hyperframes-animation/rules/discrete-text-sequence.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +307 -0
- package/.agents/skills/hyperframes-animation/rules/gsap-effects.md +299 -0
- package/.agents/skills/hyperframes-animation/rules/hacker-flip-3d.md +223 -0
- package/.agents/skills/hyperframes-animation/rules/kinetic-beat-slam.md +183 -0
- package/.agents/skills/hyperframes-animation/rules/motion-blur-streak.md +328 -0
- package/.agents/skills/hyperframes-animation/rules/multi-phase-camera.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/orbit-3d-entry.md +301 -0
- package/.agents/skills/hyperframes-animation/rules/physics-press-reaction.md +350 -0
- package/.agents/skills/hyperframes-animation/rules/press-release-spring.md +296 -0
- package/.agents/skills/hyperframes-animation/rules/reactive-displacement.md +277 -0
- package/.agents/skills/hyperframes-animation/rules/scale-swap-transition.md +298 -0
- package/.agents/skills/hyperframes-animation/rules/sine-wave-loop.md +278 -0
- package/.agents/skills/hyperframes-animation/rules/split-tilt-cards.md +277 -0
- package/.agents/skills/hyperframes-animation/rules/spring-pop-entrance.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/stat-bars-and-fills.md +156 -0
- package/.agents/skills/hyperframes-animation/rules/svg-icon-enrichment.md +329 -0
- package/.agents/skills/hyperframes-animation/rules/svg-path-draw.md +274 -0
- package/.agents/skills/hyperframes-animation/rules/vertical-spring-ticker.md +239 -0
- package/.agents/skills/hyperframes-animation/rules/viewport-change.md +349 -0
- package/.agents/skills/hyperframes-animation/rules-index.md +86 -0
- package/.agents/skills/hyperframes-animation/scripts/animation-map.mjs +606 -0
- package/.agents/skills/hyperframes-animation/scripts/package-loader.mjs +288 -0
- package/.agents/skills/hyperframes-animation/scripts/package-loader.test.mjs +62 -0
- package/.agents/skills/hyperframes-animation/techniques.md +507 -0
- package/.agents/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +167 -0
- package/.agents/skills/hyperframes-animation/transitions/catalog.md +127 -0
- package/.agents/skills/hyperframes-animation/transitions/css-3d.md +12 -0
- package/.agents/skills/hyperframes-animation/transitions/css-blur.md +51 -0
- package/.agents/skills/hyperframes-animation/transitions/css-cover.md +43 -0
- package/.agents/skills/hyperframes-animation/transitions/css-destruction.md +95 -0
- package/.agents/skills/hyperframes-animation/transitions/css-dissolve.md +66 -0
- package/.agents/skills/hyperframes-animation/transitions/css-distortion.md +45 -0
- package/.agents/skills/hyperframes-animation/transitions/css-grid.md +10 -0
- package/.agents/skills/hyperframes-animation/transitions/css-light.md +49 -0
- package/.agents/skills/hyperframes-animation/transitions/css-mechanical.md +30 -0
- package/.agents/skills/hyperframes-animation/transitions/css-other.md +25 -0
- package/.agents/skills/hyperframes-animation/transitions/css-push.md +41 -0
- package/.agents/skills/hyperframes-animation/transitions/css-radial.md +37 -0
- package/.agents/skills/hyperframes-animation/transitions/css-scale.md +24 -0
- package/.agents/skills/hyperframes-animation/transitions/overview.md +153 -0
- package/.agents/skills/hyperframes-cli/SKILL.md +113 -0
- package/.agents/skills/hyperframes-cli/references/doctor-browser.md +45 -0
- package/.agents/skills/hyperframes-cli/references/init-and-scaffold.md +55 -0
- package/.agents/skills/hyperframes-cli/references/lambda.md +132 -0
- package/.agents/skills/hyperframes-cli/references/lint-validate-inspect.md +121 -0
- package/.agents/skills/hyperframes-cli/references/preview-render.md +149 -0
- package/.agents/skills/hyperframes-cli/references/upgrade-info-misc.md +75 -0
- package/.agents/skills/hyperframes-core/SKILL.md +78 -0
- package/.agents/skills/hyperframes-core/references/composition-patterns.md +263 -0
- package/.agents/skills/hyperframes-core/references/data-attributes.md +70 -0
- package/.agents/skills/hyperframes-core/references/determinism-rules.md +68 -0
- package/.agents/skills/hyperframes-core/references/full-screen-motion.md +62 -0
- package/.agents/skills/hyperframes-core/references/minimal-composition.md +66 -0
- package/.agents/skills/hyperframes-core/references/script-format.md +49 -0
- package/.agents/skills/hyperframes-core/references/storyboard-format.md +95 -0
- package/.agents/skills/hyperframes-core/references/sub-compositions.md +237 -0
- package/.agents/skills/hyperframes-core/references/subagent-dispatch.md +41 -0
- package/.agents/skills/hyperframes-core/references/tailwind.md +125 -0
- package/.agents/skills/hyperframes-core/references/tracks-and-clips.md +76 -0
- package/.agents/skills/hyperframes-core/references/variables-and-media.md +90 -0
- package/.agents/skills/hyperframes-creative/SKILL.md +70 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md +289 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/caption-skin.html +221 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/frame-showcase.html +1214 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/FRAME.md +275 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/frame-showcase.html +1347 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/FRAME.md +307 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/caption-skin.html +223 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/frame-showcase.html +1372 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/FRAME.md +275 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/caption-skin.html +230 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/frame-showcase.html +1140 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/FRAME.md +284 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/caption-skin.html +225 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/frame-showcase.html +1166 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/FRAME.md +284 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/frame-showcase.html +1465 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/FRAME.md +278 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/caption-skin.html +222 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/frame-showcase.html +1263 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/FRAME.md +277 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/frame-showcase.html +1439 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md +265 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/caption-skin.html +238 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/frame-showcase.html +1468 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/FRAME.md +314 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/caption-skin.html +226 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/frame-showcase.html +1268 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/FRAME.md +333 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/caption-skin.html +227 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/frame-showcase.html +1330 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/FRAME.md +274 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/caption-skin.html +230 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/frame-showcase.html +1444 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/FRAME.md +265 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/caption-skin.html +223 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/frame-showcase.html +1273 -0
- package/.agents/skills/hyperframes-creative/palettes/bold-energetic.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/clean-corporate.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/dark-premium.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/jewel-rich.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/monochrome.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/nature-earth.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/neon-electric.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/pastel-soft.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/warm-editorial.md +14 -0
- package/.agents/skills/hyperframes-creative/references/audio-reactive.md +76 -0
- package/.agents/skills/hyperframes-creative/references/beat-direction.md +164 -0
- package/.agents/skills/hyperframes-creative/references/composition-patterns.md +199 -0
- package/.agents/skills/hyperframes-creative/references/data-in-motion.md +19 -0
- package/.agents/skills/hyperframes-creative/references/design-adherence.md +19 -0
- package/.agents/skills/hyperframes-creative/references/design-picker.md +123 -0
- package/.agents/skills/hyperframes-creative/references/design-spec.md +55 -0
- package/.agents/skills/hyperframes-creative/references/house-style.md +73 -0
- package/.agents/skills/hyperframes-creative/references/motion-principles.md +150 -0
- package/.agents/skills/hyperframes-creative/references/narration.md +92 -0
- package/.agents/skills/hyperframes-creative/references/prompt-expansion.md +68 -0
- package/.agents/skills/hyperframes-creative/references/typography.md +218 -0
- package/.agents/skills/hyperframes-creative/references/video-composition.md +63 -0
- package/.agents/skills/hyperframes-creative/references/visual-styles.md +457 -0
- package/.agents/skills/hyperframes-creative/scripts/contrast-report.mjs +353 -0
- package/.agents/skills/hyperframes-creative/scripts/extract-audio-data.py +188 -0
- package/.agents/skills/hyperframes-creative/scripts/package-loader.mjs +288 -0
- package/.agents/skills/hyperframes-creative/scripts/package-loader.test.mjs +62 -0
- package/.agents/skills/hyperframes-creative/templates/design-picker.html +1432 -0
- package/.agents/skills/hyperframes-keyframes/SKILL.md +237 -0
- package/.agents/skills/hyperframes-keyframes/agents/openai.yaml +4 -0
- package/.agents/skills/hyperframes-keyframes/references/keyframe-patterns.md +106 -0
- package/.agents/skills/motion-graphics/SKILL.md +172 -0
- package/.agents/skills/motion-graphics/agents/builder.md +40 -0
- package/.agents/skills/motion-graphics/agents/director.md +53 -0
- package/.agents/skills/motion-graphics/agents/finalize.md +17 -0
- package/.agents/skills/motion-graphics/catalog-map.md +40 -0
- package/.agents/skills/motion-graphics/categories/asset-fusion/module.md +37 -0
- package/.agents/skills/motion-graphics/categories/charts/module.md +21 -0
- package/.agents/skills/motion-graphics/categories/kinetic-type/module.md +19 -0
- package/.agents/skills/motion-graphics/categories/logo-reveal/module.md +17 -0
- package/.agents/skills/motion-graphics/categories/lower-thirds/module.md +16 -0
- package/.agents/skills/motion-graphics/categories/maps/bake-basemap.mjs +273 -0
- package/.agents/skills/motion-graphics/categories/maps/module.md +61 -0
- package/.agents/skills/motion-graphics/categories/news/module.md +56 -0
- package/.agents/skills/motion-graphics/categories/stat/module.md +21 -0
- package/.agents/skills/motion-graphics/categories/tweet/module.md +16 -0
- package/.agents/skills/motion-graphics/categories/webpage/module.md +21 -0
- package/.agents/skills/motion-graphics/grounding/PROTOCOL.md +64 -0
- package/.agents/skills/motion-graphics/grounding/locate.mjs +227 -0
- package/.agents/skills/motion-graphics/phases/source/guide.md +21 -0
- package/.agents/skills/motion-graphics/references/builder-contract.md +38 -0
- package/.agents/skills/motion-graphics/references/motion-vocabulary.md +43 -0
- package/.agents/skills/motion-graphics/references/shot-plan-ir.md +54 -0
- package/.agents/skills/motion-graphics/samples/asset-fusion/_ref-circle-highlight.html +306 -0
- package/.agents/skills/music/SKILL.md +416 -0
- package/.agents/skills/music/references/api_reference.md +519 -0
- package/.agents/skills/music/references/installation.md +65 -0
- package/.agents/skills/product-launch-video/SKILL.md +208 -0
- package/.agents/skills/product-launch-video/references/cut-catalog.md +220 -0
- package/.agents/skills/product-launch-video/references/motion-language.md +156 -0
- package/.agents/skills/product-launch-video/references/story-design.md +373 -0
- package/.agents/skills/product-launch-video/references/visual-design.md +126 -0
- package/.agents/skills/product-launch-video/scripts/assemble-index.mjs +570 -0
- package/.agents/skills/product-launch-video/scripts/audio.mjs +260 -0
- package/.agents/skills/product-launch-video/scripts/build-frame.mjs +536 -0
- package/.agents/skills/product-launch-video/scripts/captions.mjs +508 -0
- package/.agents/skills/product-launch-video/scripts/lib/assets.mjs +55 -0
- package/.agents/skills/product-launch-video/scripts/lib/dimensions.mjs +45 -0
- package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.mjs +36 -0
- package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.test.mjs +76 -0
- package/.agents/skills/product-launch-video/scripts/lib/storyboard.mjs +249 -0
- package/.agents/skills/product-launch-video/scripts/lib/tokens.mjs +204 -0
- package/.agents/skills/product-launch-video/scripts/lib/transition-registry.mjs +38 -0
- package/.agents/skills/product-launch-video/scripts/lib/transitions.json +71 -0
- package/.agents/skills/product-launch-video/scripts/stage-assets.mjs +39 -0
- package/.agents/skills/product-launch-video/scripts/transitions.mjs +327 -0
- package/.agents/skills/product-launch-video/sub-agents/frame-worker.md +75 -0
- package/.agents/skills/slideshow/SKILL.md +550 -0
- package/.agents/skills/slideshow/references/standalone-harness.md +1020 -0
- package/.agents/skills/talking-head-recut/NOTICE.md +39 -0
- package/.agents/skills/talking-head-recut/SKILL.md +1195 -0
- package/.agents/skills/talking-head-recut/assets/vendor/gsap.min.js +10 -0
- package/.agents/skills/talking-head-recut/references/DESIGN_INDEX.md +145 -0
- package/.agents/skills/talking-head-recut/references/frames/clean.html +92 -0
- package/.agents/skills/talking-head-recut/references/frames/hairline.html +171 -0
- package/.agents/skills/talking-head-recut/references/frames/polaroid.html +131 -0
- package/.agents/skills/talking-head-recut/references/layouts/overlay.html +164 -0
- package/.agents/skills/talking-head-recut/references/layouts/pip.html +143 -0
- package/.agents/skills/talking-head-recut/references/layouts/split.html +121 -0
- package/.agents/skills/talking-head-recut/references/layouts/stack.html +109 -0
- package/.agents/skills/talking-head-recut/references/styles/academic.html +172 -0
- package/.agents/skills/talking-head-recut/references/styles/audit.html +170 -0
- package/.agents/skills/talking-head-recut/references/styles/editorial.html +189 -0
- package/.agents/skills/talking-head-recut/references/styles/geom.html +181 -0
- package/.agents/skills/talking-head-recut/references/styles/minimal.html +130 -0
- package/.agents/skills/talking-head-recut/references/styles/spotlight.html +142 -0
- package/.agents/skills/talking-head-recut/references/styles/swiss.html +188 -0
- package/.agents/skills/talking-head-recut/references/styles/terminal.html +196 -0
- package/.agents/skills/talking-head-recut/references/styles/whiteboard.html +170 -0
- package/.agents/skills/talking-head-recut/references/styles/xhs.html +206 -0
- package/.agents/skills/text-to-speech/SKILL.md +226 -0
- package/.agents/skills/text-to-speech/references/installation.md +90 -0
- package/.agents/skills/text-to-speech/references/streaming.md +307 -0
- package/.agents/skills/text-to-speech/references/voice-settings.md +115 -0
- package/.agents/skills/vidfarm-director/SKILL.md +179 -0
- package/.agents/skills/vidfarm-director/recipes/find-and-fork-template.md +16 -0
- package/.agents/skills/vidfarm-director/recipes/local-edit-render-approve.md +13 -0
- package/.agents/skills/vidfarm-director/recipes/onboard-a-new-director.md +13 -0
- package/.agents/skills/vidfarm-director/recipes/retheme-template.md +17 -0
- package/.agents/skills/vidfarm-director/references/assets-and-sourcing.md +117 -0
- package/.agents/skills/vidfarm-director/references/automation-and-local-dev.md +276 -0
- package/.agents/skills/vidfarm-director/references/core-workflows.md +301 -0
- package/.agents/skills/vidfarm-director/references/editor-workflows.md +367 -0
- package/.agents/skills/vidfarm-director/references/onboarding.md +28 -0
- package/.agents/skills/vidfarm-director/references/primitives.md +307 -0
- package/.agents/skills/vidfarm-director/references/rest-api.md +84 -0
- package/.agents/skills/vidfarm-media/SKILL.md +158 -0
- package/.agents/skills/vidfarm-media/references/tts.md +111 -0
- package/.agents/skills/vidfarm-media/scripts/audio.mjs +628 -0
- package/.agents/skills/vidfarm-media/scripts/wait-bgm.mjs +31 -0
- package/.agents/skills/website-to-video/SKILL.md +145 -0
- package/.agents/skills/website-to-video/assets/sfx/CREDITS.md +35 -0
- package/.agents/skills/website-to-video/assets/sfx/manifest.json +97 -0
- package/.agents/skills/website-to-video/references/beat-builder-guide.md +263 -0
- package/.agents/skills/website-to-video/references/capabilities.md +713 -0
- package/.agents/skills/website-to-video/references/step-0-capture.md +55 -0
- package/.agents/skills/website-to-video/references/step-1-design.md +333 -0
- package/.agents/skills/website-to-video/references/step-2-brief.md +178 -0
- package/.agents/skills/website-to-video/references/step-3-storyboard.md +572 -0
- package/.agents/skills/website-to-video/references/step-4-vo.md +225 -0
- package/.agents/skills/website-to-video/references/step-5-build.md +483 -0
- package/.agents/skills/website-to-video/references/step-6-validate.md +341 -0
- package/.agents/skills/website-to-video/scripts/w2h-verify.mjs +759 -0
- package/README.md +97 -0
- package/SKILL.director.md +1644 -0
- package/SKILL.md +83 -0
- package/demo/README.md +28 -0
- package/demo/dist/app.css +1 -0
- package/demo/dist/app.js +968 -0
- package/demo/dist/chunks/chunk-3OT2D42H.js +1 -0
- package/demo/dist/chunks/chunk-DXB73IDG.js +1 -0
- package/demo/dist/chunks/domEditingLayers-AT7G6F4L-ZTHJHB7R.js +1 -0
- package/demo/dist/chunks/hyperframes-player-7HKH6NSO.js +459 -0
- package/demo/dist/chunks/lib-XAQ37YOE.js +1 -0
- package/demo/dist/chunks/src-TJ2QYA4U.js +207 -0
- package/demo/dist/favicon.ico +0 -0
- package/demo/dist/icons/timeline/audio.svg +7 -0
- package/demo/dist/icons/timeline/captions.svg +5 -0
- package/demo/dist/icons/timeline/composition.svg +12 -0
- package/demo/dist/icons/timeline/image.svg +18 -0
- package/demo/dist/icons/timeline/music.svg +10 -0
- package/demo/dist/icons/timeline/text.svg +3 -0
- package/demo/dist/index.html +16 -0
- package/dist/src/cli.js +7258 -0
- package/dist/src/devcli/auth-store.js +67 -0
- package/dist/src/devcli/captions.js +310 -0
- package/dist/src/devcli/clip-store.js +368 -0
- package/dist/src/devcli/clips.js +1138 -0
- package/dist/src/devcli/composition-edit.js +1292 -0
- package/dist/src/devcli/cost-mode.js +149 -0
- package/dist/src/devcli/doctor.js +192 -0
- package/dist/src/devcli/hyperframes-cli.js +118 -0
- package/dist/src/devcli/local-backend.js +167 -0
- package/dist/src/devcli/local-frontend-server.js +681 -0
- package/dist/src/devcli/local-render.js +136 -0
- package/dist/src/devcli/skills.js +476 -0
- package/dist/src/devcli/speech.js +178 -0
- package/dist/src/devcli/stills.js +249 -0
- package/dist/src/devcli/telemetry.js +236 -0
- package/dist/src/devcli/timeline-edit.js +490 -0
- package/dist/src/devcli/transitions.js +205 -0
- package/dist/src/hyperframes/composition.js +780 -0
- package/dist/src/lib/crypto.js +45 -0
- package/dist/src/lib/dev-log.js +54 -0
- package/dist/src/lib/display-name.js +11 -0
- package/dist/src/lib/ids.js +24 -0
- package/dist/src/lib/images.js +19 -0
- package/dist/src/lib/json.js +15 -0
- package/dist/src/lib/package-root.js +47 -0
- package/dist/src/lib/render-media-prep.js +293 -0
- package/dist/src/lib/template-paths.js +28 -0
- package/dist/src/lib/time.js +7 -0
- package/dist/src/lib/url-clean.js +85 -0
- package/dist/src/services/captions.js +123 -0
- package/dist/src/services/clip-curation/cost.js +116 -0
- package/dist/src/services/clip-curation/ffmpeg.js +352 -0
- package/dist/src/services/clip-curation/gemini.js +418 -0
- package/dist/src/services/clip-curation/hunt.js +470 -0
- package/dist/src/services/clip-curation/index.js +19 -0
- package/dist/src/services/clip-curation/local-agent.js +248 -0
- package/dist/src/services/clip-curation/media-select.js +152 -0
- package/dist/src/services/clip-curation/presets.js +20 -0
- package/dist/src/services/clip-curation/presets.v1.json +59 -0
- package/dist/src/services/clip-curation/query.js +167 -0
- package/dist/src/services/clip-curation/refine.js +165 -0
- package/dist/src/services/clip-curation/scan.js +189 -0
- package/dist/src/services/clip-curation/source-naming.js +131 -0
- package/dist/src/services/clip-curation/taxonomy.js +73 -0
- package/dist/src/services/clip-curation/taxonomy.v1.json +102 -0
- package/dist/src/services/clip-curation/types.js +7 -0
- package/dist/src/services/composition-lint.js +199 -0
- package/dist/src/services/provider-errors.js +128 -0
- package/dist/src/services/speech.js +629 -0
- package/package.json +154 -0
- package/public/assets/discover-client-app.js +1 -0
- package/public/assets/favicon.ico +0 -0
- package/public/assets/file-directory-app.js +89 -0
- package/public/assets/homepage-app.js +54 -0
- package/public/assets/homepage-client-app.js +80 -0
- package/public/assets/landing-page-client-app.js +87 -0
- package/public/assets/logo-vidfarm.png +0 -0
- package/public/assets/page-runtime-client-app.js +94 -0
- package/public/assets/placeholders/scene-placeholder.png +0 -0
- package/public/serve-shells/editor.html +3146 -0
- package/public/serve-shells/library-files.html +3450 -0
- package/public/serve-shells/library-raws.html +4404 -0
- package/public/serve-shells/tools-clipper.html +3991 -0
- package/public/serve-shells/tools-image.html +5584 -0
- package/public/serve-shells/tools-video.html +4404 -0
|
@@ -0,0 +1,1227 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dollarplatoon-skill
|
|
3
|
+
description: >
|
|
4
|
+
Peer-to-peer task payroll infrastructure on Base L2 for private work networks. Clients create
|
|
5
|
+
USDC-funded gigs, invite gigworkers via invite links, distribute tasks via email/webhook
|
|
6
|
+
mailboxes, review proofs of work, and pay out on-chain. Reputation-driven with no dispute
|
|
7
|
+
resolution. Use when: (1) Creating gigs or joining via invite, (2) Submitting or reviewing
|
|
8
|
+
proofs, (3) Managing wallets and payouts, (4) Understanding pricing or network dynamics,
|
|
9
|
+
(5) Integrating via webhook or public submit link.
|
|
10
|
+
Triggers: dollar platoon, gig payroll, micro-gig, proof review, rollup payout, volunteer mailbox,
|
|
11
|
+
invite link, task distribution, reputation system, treasury contract, recommended prices, how it works.
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Dollar Platoon
|
|
15
|
+
|
|
16
|
+
> **Install this app on OfficeX:** [officex.app/store/en/app/dollar-platoon](https://officex.app/store/en/app/dollar-platoon)
|
|
17
|
+
|
|
18
|
+
## What Is Dollar Platoon?
|
|
19
|
+
|
|
20
|
+
Peer-to-peer task payroll on Base L2. Private, reputation-driven work networks for high-volume, low-ticket work — infrastructure, not a marketplace.
|
|
21
|
+
|
|
22
|
+
Create micro-gigs, distribute tasks to gigworkers, collect proofs, and pay out USDC on Base L2. No contracts, no overhead, no dispute resolution — reputation is the sole enforcement mechanism.
|
|
23
|
+
|
|
24
|
+
### For Clients
|
|
25
|
+
|
|
26
|
+
Scale your workforce instantly. Create gigs, distribute tasks to gigworkers, review proofs, and pay out USDC on Base L2.
|
|
27
|
+
|
|
28
|
+
- **Create Gigs** — Post tasks with USDC funding. Set price per proof, review timeouts, and distribution mode.
|
|
29
|
+
- **Review Proofs** — Approve or reject submissions with a single click. Auto-approve after timeout protects gigworkers.
|
|
30
|
+
- **Track Payouts** — Monitor funds, trigger payouts, and view on-chain transaction history.
|
|
31
|
+
|
|
32
|
+
### For Gigworkers
|
|
33
|
+
|
|
34
|
+
Earn USDC doing tasks. Join private gigs via invite links from clients, submit proofs of work, and get paid automatically on Base L2. Build your reputation as you go.
|
|
35
|
+
|
|
36
|
+
- **Join by Invite** — Clients invite you into their private work networks with invite links. Join gigs that match your skills.
|
|
37
|
+
- **Submit Proofs** — Complete tasks, submit evidence, and track your submissions across all your mailboxes.
|
|
38
|
+
- **Build Reputation** — Every approved proof builds your on-chain reputation across Volume, Quality, and Social dimensions.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## How It Works
|
|
43
|
+
|
|
44
|
+
Peer-to-peer task payroll on Base L2. Read this before creating or joining a gig.
|
|
45
|
+
|
|
46
|
+
### Overview
|
|
47
|
+
|
|
48
|
+
Dollar Platoon is composable on-chain task payroll infrastructure for private peer-to-peer work networks. There is no public marketplace: each gig is a private network, and clients invite gigworkers via invite links. Clients create gigs and fund them with USDC on Base L2. Gigworkers join via invite, receive tasks, submit proofs of completed work, and get paid automatically when proofs are approved.
|
|
49
|
+
|
|
50
|
+
The platform is designed for high-volume task payroll with no upper limit on price. There is no dispute resolution. Reputation is the sole enforcement mechanism.
|
|
51
|
+
|
|
52
|
+
**The basic flow:**
|
|
53
|
+
|
|
54
|
+
1. Client creates a gig with terms, price per task, and USDC funding
|
|
55
|
+
2. Gigworkers join via the client's invite link and receive a personal mailbox
|
|
56
|
+
3. Tasks are distributed to mailboxes via email or webhook
|
|
57
|
+
4. Gigworkers submit proofs of completed work
|
|
58
|
+
5. Client reviews and approves/rejects proofs (or auto-approve after timeout)
|
|
59
|
+
6. Approved proofs trigger USDC payouts on Base L2
|
|
60
|
+
|
|
61
|
+
### Wallets & Gas
|
|
62
|
+
|
|
63
|
+
Every user on Dollar Platoon has their own on-chain wallet on Base L2 (an Ethereum Layer 2 network). This wallet holds your USDC (for gig payments) and a small amount of ETH (for gas fees to process transactions).
|
|
64
|
+
|
|
65
|
+
**Your responsibility:** Fund your wallet with ETH for gas on the Base network. Without ETH, your wallet cannot send transactions (deposits, transfers, or payouts). You typically need only ~0.001 ETH to cover many transactions.
|
|
66
|
+
|
|
67
|
+
**Key Points:**
|
|
68
|
+
|
|
69
|
+
- **Gas fees:** Every on-chain action requires a small ETH gas fee. Base L2 fees are typically fractions of a cent.
|
|
70
|
+
- **Managed vs External:** Dollar Platoon can generate a managed (hot) wallet with encrypted key storage. Alternatively, link your own external wallet for full self-custody.
|
|
71
|
+
- **No recovery:** If you lose access to an external wallet's private keys, those funds are permanently lost. Managed wallets are recoverable through your Dollar Platoon account.
|
|
72
|
+
|
|
73
|
+
### Reputation System
|
|
74
|
+
|
|
75
|
+
Reputation is wallet-anchored, multi-dimensional, and event-sourced. Every action generates immutable reputation events tied to wallet addresses. Both clients and gigworkers have reputation.
|
|
76
|
+
|
|
77
|
+
**Dimensions:**
|
|
78
|
+
|
|
79
|
+
- **Volume** — Total USDC earned (gigworker) or paid out (client). The most basic measure of activity and trust.
|
|
80
|
+
- **Quality** — Approval rate weighted by rejection severity. Fake proofs damage quality 5x more than low-quality work.
|
|
81
|
+
- **Recency** — Decay function penalizing inactivity. Recent participants are more trustworthy than dormant ones.
|
|
82
|
+
- **Social** — Aggregate star rating from counterparty reviews, weighted by dollar amount exchanged in each gig.
|
|
83
|
+
|
|
84
|
+
**Key Features:**
|
|
85
|
+
|
|
86
|
+
- **Wallet-anchored:** Reputation is tied to wallet addresses, not user accounts. Different wallets per gig means independent reputation histories.
|
|
87
|
+
- **Permissionless:** Anyone can create a wallet and participate. Reputation must be earned.
|
|
88
|
+
- **Gig gating:** Clients can set minimum reputation thresholds (min volume, min quality, min recency) to exclude low-reputation wallets.
|
|
89
|
+
- **Informational only:** Reputation indicators are provided as informational aids. They carry no warranty of accuracy.
|
|
90
|
+
|
|
91
|
+
### Smart Contract & Payments
|
|
92
|
+
|
|
93
|
+
Dollar Platoon uses a single treasury smart contract deployed on Base L2. The contract handles USDC deposits and payouts. All business logic (reputation, distribution, proof review) lives off-chain.
|
|
94
|
+
|
|
95
|
+
**Fee Structure:**
|
|
96
|
+
|
|
97
|
+
| Event | Fee | Detail |
|
|
98
|
+
|-------|-----|--------|
|
|
99
|
+
| Client deposits USDC | 0% | No deposit fee |
|
|
100
|
+
| Gigworker payout | 10% on top | Worker receives full gross; 10% charged additionally from gig balance |
|
|
101
|
+
|
|
102
|
+
Example: Worker earns $10 → contract charges $11 total ($10 to worker, $1 platform fee).
|
|
103
|
+
|
|
104
|
+
**Key Features:**
|
|
105
|
+
|
|
106
|
+
- **Fund isolation:** Each gig has its own on-chain balance. One gig's funds cannot pay out another.
|
|
107
|
+
- **No withdrawal:** Once deposited, funds are locked in the gig. No withdrawal function exists.
|
|
108
|
+
- **Price lock:** Price per task is locked at the moment of proof submission, protecting gigworkers from mid-gig price changes.
|
|
109
|
+
- **Auto-approve timeout:** If a client does not review a proof within the review timeout period, the proof is automatically approved.
|
|
110
|
+
- **Minimum payout:** Configurable per gig (default $0). Smaller amounts accumulate until threshold is met.
|
|
111
|
+
- **No debt:** Gigs cannot go into debt. Rollups pre-check available_funds before payout.
|
|
112
|
+
|
|
113
|
+
### Security Tokens
|
|
114
|
+
|
|
115
|
+
Every gig has a 6-character alphanumeric security token embedded in its email address and webhook URL. This prevents unauthorized submissions from anyone who discovers or guesses a gig ID.
|
|
116
|
+
|
|
117
|
+
**How it works:**
|
|
118
|
+
|
|
119
|
+
- **Email:** `{gig_id}_{token}.dollar-platoon@fwd.zoomgtm.com`
|
|
120
|
+
- **Webhook:** `/inbound/webhook/{gig_id}?token={token}`
|
|
121
|
+
- Inbound requests without a valid token are rejected with 403
|
|
122
|
+
- Tokens are generated automatically on gig creation
|
|
123
|
+
- Owners can rotate tokens via the dashboard or `POST /gigs/:id/rotate-token`
|
|
124
|
+
- Rotating a token invalidates the old email address and webhook URL — update all integrations after rotating
|
|
125
|
+
- **Backward compatibility:** Existing gigs without a security token will accept all inbound requests. Generate a token from the dashboard to enable protection.
|
|
126
|
+
|
|
127
|
+
### Third-Party Publisher Apps
|
|
128
|
+
|
|
129
|
+
Dollar Platoon does not control task content or delivery. Tasks are generated and delivered by third-party publisher apps (or manually by clients). Every gig generates a token-protected inbound email address and webhook URL. Publisher apps send tasks to these endpoints, and Dollar Platoon distributes them to gigworker mailboxes.
|
|
130
|
+
|
|
131
|
+
Dollar Platoon has no control over what publisher apps send. Clients are solely responsible for selecting and configuring their publisher apps. Gigworkers should review gig terms carefully before joining.
|
|
132
|
+
|
|
133
|
+
### Composability & Flexible Workflow
|
|
134
|
+
|
|
135
|
+
Dollar Platoon handles only the payroll layer: distribution, proof collection, reputation, and payment. Everything else is pluggable:
|
|
136
|
+
|
|
137
|
+
- **Task generation:** Use any publisher app, email client, or manual workflow
|
|
138
|
+
- **Task delivery:** Email forwarding, webhook forwarding, or both
|
|
139
|
+
- **Proof validation:** Manual client review, webhook-based automation, AI agents, or timeout auto-approval
|
|
140
|
+
- **Distribution modes:** Round robin, random, priority weighted, free-for-all, FIFO queue, or inbound proof
|
|
141
|
+
- **Reputation gating:** Set minimums per gig or leave open to all
|
|
142
|
+
|
|
143
|
+
### Trust & Validation
|
|
144
|
+
|
|
145
|
+
Trust is earned, not granted. The reputation system provides signals but not guarantees.
|
|
146
|
+
|
|
147
|
+
**For clients:** Review proofs carefully. Use rejection tags to flag bad work. Set reputation thresholds to filter applicants. Configure proof webhooks for automated validation. Consider requiring member approval for new joiners.
|
|
148
|
+
|
|
149
|
+
**For gigworkers:** Check the client's reputation score before joining. Look at their volume, quality, and social ratings. Check the gig's available funds. Understand the review timeout period.
|
|
150
|
+
|
|
151
|
+
**Highly recommended:** Extend trust validation with your own systems and AI agents. Use proof webhooks to validate submissions programmatically.
|
|
152
|
+
|
|
153
|
+
### As-Is Risk Nature
|
|
154
|
+
|
|
155
|
+
Dollar Platoon is provided on an "as-is" and "as-available" basis. ZoomGTM operates it as a technology platform only. Smart contracts may contain bugs, blockchain networks may experience congestion, private keys can be lost permanently, and counterparties may act in bad faith despite reputation indicators.
|
|
156
|
+
|
|
157
|
+
This is a permissionless system. All parties participate entirely at their own risk and expense.
|
|
158
|
+
|
|
159
|
+
### Liability Waiver
|
|
160
|
+
|
|
161
|
+
By using Dollar Platoon, you irrevocably waive all claims against ZoomGTM and its affiliates. No dispute resolution. No warranties. Maximum aggregate liability: $0.
|
|
162
|
+
|
|
163
|
+
### Prohibited Uses
|
|
164
|
+
|
|
165
|
+
Dollar Platoon may not be used for illegal activities, adult content, harassment, money laundering, malware distribution, circumventing sanctions, or high-risk financial services. ZoomGTM may suspend access at any time without notice. See full Terms of Use.
|
|
166
|
+
|
|
167
|
+
### Extending with Your Own Systems
|
|
168
|
+
|
|
169
|
+
- **AI Agent Task Delivery (Recommended)** — Use the webhook endpoint to push tasks with dual-format HTML payloads. Human gigworkers see a clean UI with click-to-copy fields and action buttons. AI agents extract structured JSON from the hidden `div.agent-data`. One payload serves both audiences.
|
|
170
|
+
- **AI Agent Review** — Configure proof webhooks to send submissions to your own AI agent for automated quality checks
|
|
171
|
+
- **Custom Validation Pipelines** — Build webhook handlers that validate proofs against external data sources
|
|
172
|
+
- **Publisher App Integration** — Build or use third-party publisher apps to generate tasks via webhook
|
|
173
|
+
- **AI Agent Gigworking** — Set a webhook URL on your mailbox when joining a gig. Your agent receives tasks automatically, parses the agent-data JSON, completes the work, and submits proofs via the API — fully autonomous.
|
|
174
|
+
- **Manual Workflow** — Email tasks to your gig address, review proofs in the dashboard, click approve/reject
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Important Warnings & Best Practices
|
|
179
|
+
|
|
180
|
+
### Gig Funding
|
|
181
|
+
|
|
182
|
+
- **Fund your gig before approving proofs.** Approved proofs cannot be paid if the gig has insufficient funds. The platform will reject the rollup.
|
|
183
|
+
- **Account for the 10% platform fee.** A $100 payout costs $110 from the gig balance. When funding, budget 110% of expected payouts.
|
|
184
|
+
- **Funds are locked.** There is no withdrawal function. Once USDC is deposited into a gig, it can only leave via worker payouts. Deposit conservatively and top up as needed.
|
|
185
|
+
- **No debt allowed.** Rollups pre-check `available_funds >= gross_amount + platform_fee`. If the gig can't cover the payout, it fails entirely.
|
|
186
|
+
- **Monitor your balance.** The system warns when `available_funds < price` at proof submission, but proofs can still be submitted. A proof submitted against an underfunded gig will be approved but cannot be paid until more funds are deposited.
|
|
187
|
+
|
|
188
|
+
### Proof Submission
|
|
189
|
+
|
|
190
|
+
- **Always include a `task_identifier`.** For `queue` gigs, use the polled task's `id` (the inbound message ULID) — this is how the server claims the queue item off to you and prevents other workers from double-handling it. For other distribution modes and `inbound_proof` gigs, use the task's unique reference (URL, ticket ID, etc.). **Do not use the subject line** — subjects are not unique, and collisions cause duplicate-submission 409s and missed payouts.
|
|
191
|
+
- **Include verifiable evidence.** Proofs should contain URLs, screenshots, or other evidence that the client can independently verify. Unverifiable proofs are more likely to be rejected.
|
|
192
|
+
- **Upload proof files via presigned URL first.** Use `POST /upload/presign` to get an S3 upload URL, upload your file, then include the returned `url` in your proof's `proofs` array.
|
|
193
|
+
- **Check gig funding before submitting.** The gig detail endpoint shows `available_funds`. If funds are low, your proof may be approved but payment delayed until the client tops up.
|
|
194
|
+
- **Price is locked at submission.** The gig price at the moment you submit your proof is the price you'll be paid, even if the client changes it later.
|
|
195
|
+
|
|
196
|
+
### Proof Review (Clients)
|
|
197
|
+
|
|
198
|
+
- **Review promptly.** Proofs auto-approve after the `review_timeout` period (default 48 hours). If you miss the window, the proof is treated as approved.
|
|
199
|
+
- **Use rejection tags.** When rejecting, always include a `rejection_tag`. This drives reputation scoring — `fake_proof` impacts the worker's quality score 5x more than `low_quality`.
|
|
200
|
+
- **Report timeout-approved proofs.** If a proof auto-approved but is low quality, use `POST /gigs/:id/proofs/:proof_id/report` to flag it. Reported proofs are excluded from payouts.
|
|
201
|
+
- **Configure proof webhooks.** Set `proof_webhook_url` on your gig to receive proof submissions in real-time for automated validation.
|
|
202
|
+
|
|
203
|
+
### Payouts
|
|
204
|
+
|
|
205
|
+
- **Trigger rollups manually or wait for the daily cron.** `POST /gigs/:id/rollups` processes all approved proofs immediately. The daily cron also processes approved proofs automatically.
|
|
206
|
+
- **Minimum payout threshold.** If `min_payout` is set, mailboxes with earnings below the threshold are skipped (returned in `skipped_below_minimum`). Their proofs accumulate until the threshold is met.
|
|
207
|
+
- **Check rollup status.** Rollups can fail if the on-chain transaction reverts (e.g., insufficient gas, contract error). Failed rollups are retried by the daily cron.
|
|
208
|
+
|
|
209
|
+
### Share Tokens (Delegated Proof Submission)
|
|
210
|
+
|
|
211
|
+
- **Gigworkers can share a link for proof submission without login.** Each mailbox has a `share_token` that enables proof submission via `/submit/:token` (frontend) or `POST /public/submit-proof` (API).
|
|
212
|
+
- **Regenerate tokens if compromised.** Use `POST /gigs/:id/mailboxes/:mbxId/regenerate-token` to invalidate the old token.
|
|
213
|
+
- **Rate limited.** Public endpoints are limited to 10-30 requests/minute per token.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Recommended Prices
|
|
218
|
+
|
|
219
|
+
Suggested pricing for common gig tasks on Dollar Platoon.
|
|
220
|
+
|
|
221
|
+
**These are suggestions, not requirements.** Prices reflect market supply and demand for delivery. Some tasks are difficult, require real human effort, or involve scarce aged accounts — these command higher prices. Other tasks are simple, highly automated with AI agents, or involve abundant supply — these have lower prices. Set your price based on what the market will bear.
|
|
222
|
+
|
|
223
|
+
| Category | Action | Suggested Price (USDC) |
|
|
224
|
+
|----------|--------|------------------------|
|
|
225
|
+
| **Reddit, Forums & et al** | Post | $1 - $10 |
|
|
226
|
+
| | Comment | $0.10 - $1 |
|
|
227
|
+
| | Upvote | $0.05 - $0.20 |
|
|
228
|
+
| | Account creation | $10 - $50 |
|
|
229
|
+
| **Blogs** | Programmatic SEO article | $0.01 - $0.10 |
|
|
230
|
+
| | Premium blog (Medium, Substack, LinkedIn) | $0.50 - $2 |
|
|
231
|
+
| | Account creation | $2 - $10 |
|
|
232
|
+
| | Backlink | $0.01 - $2 |
|
|
233
|
+
| **X / Twitter / Bluesky / Threads** | Comment | $0.06 - $0.10 |
|
|
234
|
+
| | Follow | $0.05 - $0.50 |
|
|
235
|
+
| | Account creation | $5 - $20 |
|
|
236
|
+
| **Facebook** | Post in group | $0.50 - $2 |
|
|
237
|
+
| | Comment on post | $0.10 - $0.50 |
|
|
238
|
+
| | Account creation | $50 |
|
|
239
|
+
| **Instagram** | Comment | $0.06 - $0.50 |
|
|
240
|
+
| | Follow | $0.10 - $1 |
|
|
241
|
+
| | Like | $0.06 - $0.10 |
|
|
242
|
+
| | Account creation | $20 |
|
|
243
|
+
| **LinkedIn** | Comment | $0.10 - $0.50 |
|
|
244
|
+
| | Post | $1 - $2 |
|
|
245
|
+
| | Account creation | $50 |
|
|
246
|
+
| **TikTok** | Comment | $0.06 - $0.50 |
|
|
247
|
+
| | Post (varies by georegion) | $0.50 - $5 |
|
|
248
|
+
| | Follow | $0.05 - $0.50 |
|
|
249
|
+
| | Like | $0.06 - $0.10 |
|
|
250
|
+
| | Account creation | $10 - $50 |
|
|
251
|
+
| **YouTube** | Like | $0.05 - $0.20 |
|
|
252
|
+
| | Playthrough | $0.10 - $0.50 |
|
|
253
|
+
| | Comment | $0.20 - $0.50 |
|
|
254
|
+
| | Video upload | $1 - $5 |
|
|
255
|
+
| | Account creation | $10 - $20 |
|
|
256
|
+
| **Google Reviews & et al** | Review | $0.50 - $5 |
|
|
257
|
+
| | Account creation | $10 - $30 |
|
|
258
|
+
| **Gmail, Outlook & et al** | Marked not spam | $0.05 - $0.20 |
|
|
259
|
+
| | Account creation | $2 - $5 |
|
|
260
|
+
| **Product Hunt & et al** | Action (upvote, comment, etc.) | $0.25 - $2 |
|
|
261
|
+
| | Account creation | $5 - $20 |
|
|
262
|
+
| **Discord & Telegram** | Group join | $0.50 - $2 |
|
|
263
|
+
| | Message | $0.50 - $1 |
|
|
264
|
+
| **Surveys & et al** | Survey completion | $0.50 - $2 |
|
|
265
|
+
| **ChatGPT, Gemini & et al** | Ask mention | $0.05 - $0.10 |
|
|
266
|
+
| **App Testing & Focus Groups** | Task | $2 - $10 |
|
|
267
|
+
| **Creative Curation** | Submission | $0.10 - $1 |
|
|
268
|
+
| **Creative Creation** | Creative approved | $0.10 - $5 |
|
|
269
|
+
| **Directory Posting** | Signup to post | $0.50 - $2 |
|
|
270
|
+
| **Funnel Spy** | Screen recording | $2 - $5 |
|
|
271
|
+
| **Custom Tasks** | Task (varies by complexity & time) | $0.50 - $5 |
|
|
272
|
+
| **Special Task** | Special task | $3 - $9 |
|
|
273
|
+
|
|
274
|
+
### Why Do Prices Vary?
|
|
275
|
+
|
|
276
|
+
- **Account scarcity:** Aged, verified accounts on platforms like Facebook and LinkedIn are scarce and expensive to create
|
|
277
|
+
- **Platform difficulty:** Some platforms have aggressive anti-bot detection, making actions harder and more expensive
|
|
278
|
+
- **Georegion:** Tasks targeting specific geographic regions may cost more due to limited local supply
|
|
279
|
+
- **Automation level:** Highly automatable tasks (AI-written SEO articles, bulk likes) are cheaper. Tasks requiring genuine human engagement cost more
|
|
280
|
+
- **Risk:** Actions that risk account suspension (posting in strict subreddits, leaving Google reviews) command a premium
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Getting Started
|
|
285
|
+
|
|
286
|
+
### 1. Get Your API Key
|
|
287
|
+
|
|
288
|
+
Sign up or log in at [dollarplatoon.com](https://dollarplatoon.com), then go to **Settings** to find your API key:
|
|
289
|
+
|
|
290
|
+
> **Get your API key:** [dollarplatoon.com/client/settings](https://dollarplatoon.com/client/settings)
|
|
291
|
+
|
|
292
|
+
### 2. Configure Your Environment
|
|
293
|
+
|
|
294
|
+
Add your API key to your `.env` file:
|
|
295
|
+
|
|
296
|
+
```bash
|
|
297
|
+
DOLLAR_PLATOON_API_KEY="your_api_key_here"
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### 3. Make API Requests
|
|
301
|
+
|
|
302
|
+
All API requests require an `x-api-key` header. Pass your `DOLLAR_PLATOON_API_KEY` as the value.
|
|
303
|
+
|
|
304
|
+
**Base URL:** `https://dollarplatoon.com/api`
|
|
305
|
+
|
|
306
|
+
All API paths below are relative to this base URL. For example, `POST /auth/send-otp` means `POST https://dollarplatoon.com/api/auth/send-otp`.
|
|
307
|
+
|
|
308
|
+
**Example:**
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
curl -H "x-api-key: $DOLLAR_PLATOON_API_KEY" https://dollarplatoon.com/api/auth/me
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### 4. Autologin Deep Links (Web)
|
|
315
|
+
|
|
316
|
+
Append `?api_key=` to **any** dollarplatoon.com page URL to log in and land on that exact page in one step — ideal for agents or emails that deep-link users straight into a dashboard:
|
|
317
|
+
|
|
318
|
+
```
|
|
319
|
+
https://dollarplatoon.com/client/gig/GIG_01HX.../dashboard?api_key=YOUR_API_KEY
|
|
320
|
+
https://dollarplatoon.com/gigworker/mailboxes?api_key=YOUR_API_KEY
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
Behavior:
|
|
324
|
+
|
|
325
|
+
- The key is validated, the session is stored, and the `api_key` param is immediately scrubbed from the address bar and browser history. Other query params are preserved.
|
|
326
|
+
- Already logged in with the same key? The page loads directly — no redirect or flicker.
|
|
327
|
+
- Logged in as someone else? The URL's key wins and the session switches to that account.
|
|
328
|
+
- Invalid key? Any existing session is kept; otherwise you land on the page logged out.
|
|
329
|
+
|
|
330
|
+
There is also a dedicated `/auto-login?api_key=...&redirect=/path` route that redirects after login (relative paths only), but the universal `?api_key=` param above is simpler for deep links.
|
|
331
|
+
|
|
332
|
+
> ⚠️ A URL containing `api_key` grants full account access to anyone who has it. Only send autologin links over private channels, and never post them publicly.
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## AI Agents & Automation
|
|
337
|
+
|
|
338
|
+
Dollar Platoon believes in harmony between humans and AI. Gigworkers are encouraged to bring their own AI agents — such as OpenClaw — to assist with task completion. Clients know and welcome this. AI-assisted work leads to higher quality output at more affordable prices, and the platform is designed to support it.
|
|
339
|
+
|
|
340
|
+
Whether you use AI to draft content, validate proofs, automate submissions, or manage your workflow, Dollar Platoon is encouraging of AI usage. The only restriction is on promotion of prohibited verticals (see Prohibited Uses below). Beyond that, use whatever tools make you most effective.
|
|
341
|
+
|
|
342
|
+
**For gigworkers:** Leverage AI agents to increase your throughput and quality. Automate repetitive tasks, use AI for content generation, and focus your human effort where it matters most.
|
|
343
|
+
|
|
344
|
+
**For clients:** Configure proof webhooks to route submissions to your own AI agents for automated quality checks and validation. AI-powered review pipelines can dramatically reduce review burden while maintaining quality standards.
|
|
345
|
+
|
|
346
|
+
### Use Webhook for Task Delivery (Strongly Recommended)
|
|
347
|
+
|
|
348
|
+
**AI agents should always prefer the webhook endpoint for delivering tasks to gigs.** The webhook (`POST /inbound/webhook/:gig_id?token=...`) is the most reliable, flexible, and automatable way to push tasks. Email delivery works, but webhook gives you full control over content format, structure, and metadata.
|
|
349
|
+
|
|
350
|
+
**Why webhook over email:**
|
|
351
|
+
|
|
352
|
+
- **No email parsing overhead** — deliver structured data directly
|
|
353
|
+
- **Supports JSON and HTML** — choose the best format for your use case
|
|
354
|
+
- **Instant delivery** — no email relay delays
|
|
355
|
+
- **Full control** — set subject, format, and payload exactly how you want
|
|
356
|
+
- **Agent-friendly** — AI agents on the receiving end can parse structured data from the payload
|
|
357
|
+
|
|
358
|
+
### Choosing Your Task Format: JSON vs HTML
|
|
359
|
+
|
|
360
|
+
The webhook endpoint supports three approaches depending on your audience:
|
|
361
|
+
|
|
362
|
+
| Audience | Content-Type | When to use |
|
|
363
|
+
|----------|-------------|-------------|
|
|
364
|
+
| **Pure AI agents** | `application/json` | All gigworkers are AI agents. Send structured JSON — no HTML needed. |
|
|
365
|
+
| **Pure humans** | `text/html` | All gigworkers are humans. Send rich HTML with click-to-copy fields and action buttons. |
|
|
366
|
+
| **Mixed / unknown** | `text/html` | Gigworkers may be humans, AI agents, or humans with AI assistants. Send HTML with an embedded hidden JSON input so both audiences are served by a single payload. |
|
|
367
|
+
|
|
368
|
+
**If your gig is 100% AI agents, just send JSON.** No need for HTML. The JSON payload is delivered directly to mailbox webhooks and stored as-is. AI agents parse it natively.
|
|
369
|
+
|
|
370
|
+
**If humans might be involved, send HTML** with the dual-format pattern below.
|
|
371
|
+
|
|
372
|
+
### Dual-Format HTML: For Humans AND AI Agents
|
|
373
|
+
|
|
374
|
+
When delivering tasks via webhook with `Content-Type: text/html`, design your HTML so it works for both humans and AI agents from a single payload.
|
|
375
|
+
|
|
376
|
+
**Design your HTML task payloads with these principles:**
|
|
377
|
+
|
|
378
|
+
1. **Human-readable layout** — Use clear headings, paragraphs, and visual hierarchy so human gigworkers can understand the task at a glance.
|
|
379
|
+
2. **Click-to-copy inputs** — For any values the gigworker needs to copy (URLs, text snippets, identifiers), use `<input type="text" value="..." readonly onclick="this.select()">` so they can click to select and copy.
|
|
380
|
+
3. **Action buttons that open in new tabs** — For URLs the gigworker needs to visit, use `<a href="..." target="_blank" rel="noopener">` styled as buttons so they open in a new tab.
|
|
381
|
+
4. **Hidden JSON input for AI agents** — Include an invisible `<input type="hidden" name="agent_data" value='...'>` containing the full task as JSON. AI agents extract this structured data without parsing HTML. Same tag name every time — predictable and easy to find.
|
|
382
|
+
|
|
383
|
+
**Example HTML task payload:**
|
|
384
|
+
|
|
385
|
+
```html
|
|
386
|
+
<div style="font-family: sans-serif; max-width: 600px;">
|
|
387
|
+
<h2>Post a comment on this Reddit thread</h2>
|
|
388
|
+
<p><strong>Thread URL:</strong></p>
|
|
389
|
+
<input type="text" value="https://reddit.com/r/example/comments/abc123"
|
|
390
|
+
readonly onclick="this.select()"
|
|
391
|
+
style="width:100%; padding:8px; font-size:14px; border:1px solid #ccc; border-radius:4px; cursor:pointer;">
|
|
392
|
+
<br><br>
|
|
393
|
+
<p><strong>Comment text to post:</strong></p>
|
|
394
|
+
<input type="text" value="This product changed my workflow completely. Highly recommend trying it."
|
|
395
|
+
readonly onclick="this.select()"
|
|
396
|
+
style="width:100%; padding:8px; font-size:14px; border:1px solid #ccc; border-radius:4px; cursor:pointer;">
|
|
397
|
+
<br><br>
|
|
398
|
+
<a href="https://reddit.com/r/example/comments/abc123" target="_blank" rel="noopener"
|
|
399
|
+
style="display:inline-block; padding:10px 20px; background:#0079d3; color:#fff; text-decoration:none; border-radius:6px; font-weight:bold;">
|
|
400
|
+
Open Thread in New Tab
|
|
401
|
+
</a>
|
|
402
|
+
<br><br>
|
|
403
|
+
<p style="color:#888; font-size:12px;">After posting, submit a proof with a screenshot or link to your comment.</p>
|
|
404
|
+
|
|
405
|
+
<!-- Structured JSON for AI agents — hidden from humans, easy for agents to extract -->
|
|
406
|
+
<input type="hidden" name="agent_data" value='{"task_type":"reddit_comment","thread_url":"https://reddit.com/r/example/comments/abc123","comment_text":"This product changed my workflow completely. Highly recommend trying it.","proof_requirements":["screenshot_url","comment_permalink"],"task_id":"task_001"}'>
|
|
407
|
+
</div>
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
**How this works:**
|
|
411
|
+
|
|
412
|
+
- **Human gigworker** sees a clean task with click-to-copy fields and a button to open the thread. The hidden input is invisible. No confusion, no manual URL copying.
|
|
413
|
+
- **AI agent** finds `input[name="agent_data"]` in the HTML, parses its `value` as JSON, and gets a clean structured object with `task_type`, `thread_url`, `comment_text`, `proof_requirements`, and `task_id`. No HTML parsing needed.
|
|
414
|
+
- **AI-assisted human** gets the best of both — reads the visual task, and their agent extracts the structured data from the same payload.
|
|
415
|
+
|
|
416
|
+
**Sending this via webhook:**
|
|
417
|
+
|
|
418
|
+
```bash
|
|
419
|
+
curl -X POST "https://dollarplatoon.com/api/inbound/webhook/GIG_01HX...?token=abc123&subject=Reddit+Comment+Task" \
|
|
420
|
+
-H "Content-Type: text/html" \
|
|
421
|
+
-d '<div style="font-family: sans-serif;">
|
|
422
|
+
<h2>Post a comment on this Reddit thread</h2>
|
|
423
|
+
<input type="text" value="https://reddit.com/r/example/comments/abc123" readonly onclick="this.select()" style="width:100%;padding:8px;">
|
|
424
|
+
<br><br>
|
|
425
|
+
<a href="https://reddit.com/r/example/comments/abc123" target="_blank" style="padding:10px 20px;background:#0079d3;color:#fff;text-decoration:none;border-radius:6px;">Open Thread</a>
|
|
426
|
+
<input type="hidden" name="agent_data" value='"'"'{"task_type":"reddit_comment","thread_url":"https://reddit.com/r/example/comments/abc123","comment_text":"Great product!","task_id":"task_001"}'"'"'>
|
|
427
|
+
</div>'
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
**Or send pure JSON for agent-only gigs:**
|
|
431
|
+
|
|
432
|
+
```bash
|
|
433
|
+
curl -X POST "https://dollarplatoon.com/api/inbound/webhook/GIG_01HX...?token=abc123" \
|
|
434
|
+
-H "Content-Type: application/json" \
|
|
435
|
+
-d '{"task_type":"reddit_comment","thread_url":"https://reddit.com/r/example/comments/abc123","comment_text":"Great product!","task_id":"task_001"}'
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
**Convention for AI agents parsing task payloads:**
|
|
439
|
+
|
|
440
|
+
1. If the payload is JSON (`type: "webhook"`), parse it directly — it's already structured
|
|
441
|
+
2. If the payload is HTML (`type: "email"`), look for `input[name="agent_data"]` and parse its `value` as JSON
|
|
442
|
+
3. If no `agent_data` input exists, fall back to parsing visible text content
|
|
443
|
+
4. Use `task_id` from the JSON as your `task_identifier` when submitting proofs. For `queue` gigs (where you poll tasks via `/queue/poll`), use the polled task's `id` instead — this lets the server atomically claim the queue item to your mailbox.
|
|
444
|
+
|
|
445
|
+
---
|
|
446
|
+
|
|
447
|
+
## REST API Reference
|
|
448
|
+
|
|
449
|
+
Auth via `x-api-key` header on all authenticated endpoints.
|
|
450
|
+
|
|
451
|
+
### Authentication
|
|
452
|
+
|
|
453
|
+
| Method | Path | Auth | Description |
|
|
454
|
+
|--------|------|------|-------------|
|
|
455
|
+
| POST | `/auth/send-otp` | No | Send 4-digit OTP code to email |
|
|
456
|
+
| POST | `/auth/verify-otp` | No | Verify OTP and get API key |
|
|
457
|
+
| POST | `/auth/rotate-key` | Yes | Generate new API key |
|
|
458
|
+
| GET | `/auth/me` | Yes | Get current user profile |
|
|
459
|
+
|
|
460
|
+
#### POST /auth/send-otp
|
|
461
|
+
|
|
462
|
+
```json
|
|
463
|
+
// Request
|
|
464
|
+
{ "email": "user@example.com" }
|
|
465
|
+
|
|
466
|
+
// Response
|
|
467
|
+
{ "message": "Code sent" }
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
4-digit code (1000-9999), 10-minute expiry, max 5 attempts. Sends via email.
|
|
471
|
+
|
|
472
|
+
#### POST /auth/verify-otp
|
|
473
|
+
|
|
474
|
+
```json
|
|
475
|
+
// Request
|
|
476
|
+
{ "email": "user@example.com", "code": "1234" }
|
|
477
|
+
|
|
478
|
+
// Response
|
|
479
|
+
{ "email": "user@example.com", "api_key": "base64url_encoded_key" }
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
Creates new user if first login. Auto-provisions hot wallet. Returns existing API key (no rotation on login).
|
|
483
|
+
|
|
484
|
+
#### POST /auth/rotate-key
|
|
485
|
+
|
|
486
|
+
```json
|
|
487
|
+
// Response
|
|
488
|
+
{ "api_key": "base64url_encoded_key" }
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
#### GET /auth/me
|
|
492
|
+
|
|
493
|
+
```json
|
|
494
|
+
// Response
|
|
495
|
+
{ "email": "...", "display_name": "...", "bio": "...", "avatar_url": "...", "created_at": "...", "officex_user_id": "...", "officex_install_id": "..." }
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
### Gigs
|
|
499
|
+
|
|
500
|
+
| Method | Path | Auth | Description |
|
|
501
|
+
|--------|------|------|-------------|
|
|
502
|
+
| POST | `/gigs` | Yes | Create new gig |
|
|
503
|
+
| POST | `/gigs/:id/invites` | Yes | Mint an invite link (owner only) |
|
|
504
|
+
| GET | `/gigs/:id/invites` | Yes | List invite links (owner only) |
|
|
505
|
+
| DELETE | `/gigs/:id/invites/:token` | Yes | Revoke an invite link (owner only) |
|
|
506
|
+
| GET | `/gigs/mine` | Yes | List user's owned gigs (`?tag=` substring filter) |
|
|
507
|
+
| GET | `/gigs/:id` | Optional | Get gig detail |
|
|
508
|
+
| PATCH | `/gigs/:id` | Yes | Update gig (owner only) |
|
|
509
|
+
| POST | `/gigs/:id/rotate-token` | Yes | Rotate security token (owner only) |
|
|
510
|
+
| POST | `/gigs/:id/tasks/:msgId/extend` | Yes | Reset a task's expiry clock (owner only) |
|
|
511
|
+
| POST | `/gigs/:id/tasks/:msgId/recycle` | Yes | Take a task back and redistribute it (owner only) |
|
|
512
|
+
| GET | `/gigs/:id/dashboard` | Yes | Get gig dashboard with all data (owner only) |
|
|
513
|
+
| POST | `/gigs/:id/deposit` | Yes | Deposit USDC to gig treasury |
|
|
514
|
+
|
|
515
|
+
#### POST /gigs
|
|
516
|
+
|
|
517
|
+
```json
|
|
518
|
+
// Request
|
|
519
|
+
{
|
|
520
|
+
"title": "Reddit Comments for Product Launch",
|
|
521
|
+
"price": 0.50,
|
|
522
|
+
"terms": "Comment on specified Reddit threads with genuine engagement...",
|
|
523
|
+
"notes": "Internal notes for owner only",
|
|
524
|
+
"owner_wallet": "wallet_alias_id", // optional, auto-provisions if omitted
|
|
525
|
+
"join_policy": "invite", // "invite" (default — joins require an invite token) | "open"
|
|
526
|
+
"tags": ["reddit", "writing", "q3-launch"], // arbitrary free-form strings (max 25 tags, 256 chars each)
|
|
527
|
+
"requires_approval": false,
|
|
528
|
+
"review_timeout": 172800, // seconds, default 48h
|
|
529
|
+
"task_timeout": 86400, // optional, seconds a worker may hold a task before it expires; null = no expiry (default)
|
|
530
|
+
"distribution": "round_robin", // "round_robin" | "free_for_all" | "priority_weighted" | "random" | "queue" | "inbound_proof"
|
|
531
|
+
"default_rate_limit_count": 5, // optional worker rate limit: max proofs/claims per window; both fields or neither
|
|
532
|
+
"default_rate_limit_minutes": 60, // window length in minutes; null on both = no limit (default)
|
|
533
|
+
"min_rep_volume": null,
|
|
534
|
+
"min_rep_quality": null,
|
|
535
|
+
"min_rep_recency": null,
|
|
536
|
+
"min_payout": 0,
|
|
537
|
+
"location": { "country": "US", "label": "United States" },
|
|
538
|
+
"icon_url": "https://...",
|
|
539
|
+
"proof_webhook_url": "https://...",
|
|
540
|
+
"contract_address": "0x..."
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// Response
|
|
544
|
+
{
|
|
545
|
+
"gig": {
|
|
546
|
+
"id": "GIG_01HX...",
|
|
547
|
+
"title": "Reddit Comments for Product Launch",
|
|
548
|
+
"email": "GIG_01HX..._abc123.dollar-platoon@fwd.zoomgtm.com",
|
|
549
|
+
"webhook": "https://dollarplatoon.com/api/inbound/webhook/GIG_01HX...?token=abc123",
|
|
550
|
+
"invite_url": "https://dollarplatoon.com/gig/GIG_01HX.../join?invite=a1b2c3d4e5f6",
|
|
551
|
+
"join_policy": "invite",
|
|
552
|
+
"price": 0.50,
|
|
553
|
+
"requires_approval": false,
|
|
554
|
+
"status": "active"
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
Compliance check via Gemini (blocks illegal content, warns on borderline).
|
|
560
|
+
|
|
561
|
+
Tags are **arbitrary free-form strings** — use them to categorize, group, and search gigs (e.g. by campaign, client, or batch). Max 25 tags per gig, 256 chars each. There is no whitelist.
|
|
562
|
+
|
|
563
|
+
New gigs default to `join_policy: "invite"` and are created with a **default unlimited invite** — the returned `invite_url` includes its token. Revoke it and mint scoped invites via the Invites endpoints below. There is no public marketplace: `GET /gigs` returns `410 Gone`.
|
|
564
|
+
|
|
565
|
+
#### Invites
|
|
566
|
+
|
|
567
|
+
Invite links gate who can join a gig's private network. Modes fall out of two fields: `max_uses` (1 = one-time, N = N uses, null = unlimited) and `email` (bind to an exact address, or null for anyone with the link). Email-bound invites act as pre-approvals — the invited worker skips `pending_approval` even when the gig has `requires_approval`.
|
|
568
|
+
|
|
569
|
+
```json
|
|
570
|
+
// POST /gigs/:id/invites (Owner Only)
|
|
571
|
+
// Request
|
|
572
|
+
{ "max_uses": 1, "email": "worker@example.com", "label": "for Alice" } // all fields optional
|
|
573
|
+
|
|
574
|
+
// Response
|
|
575
|
+
{
|
|
576
|
+
"invite": {
|
|
577
|
+
"token": "a1b2c3d4e5f6",
|
|
578
|
+
"max_uses": 1, "uses": 0, "email": "worker@example.com", "label": "for Alice",
|
|
579
|
+
"invite_url": "https://dollarplatoon.com/gig/GIG_01HX.../join?invite=a1b2c3d4e5f6"
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
```
|
|
583
|
+
|
|
584
|
+
`GET /gigs/:id/invites` lists all invites with `uses`, `revoked`, and `exhausted`. `DELETE /gigs/:id/invites/:token` revokes one — anyone holding the link can no longer join. Use consumption is atomic, so concurrent joins can't race past `max_uses`.
|
|
585
|
+
|
|
586
|
+
#### GET /gigs/mine
|
|
587
|
+
|
|
588
|
+
```
|
|
589
|
+
GET /gigs/mine?tag=q3
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
Lists your owned gigs (excluding closed). `?tag=` filters by case-insensitive **substring** match against gig tags; comma-separated values are OR'd — handy for grouping many gigs by campaign or batch.
|
|
593
|
+
|
|
594
|
+
#### GET /gigs/:id
|
|
595
|
+
|
|
596
|
+
Returns gig object. If authenticated as owner or member, includes `notes` and enriched data. Shows `available_funds` and `reserved_funds` so you can assess whether the gig can pay.
|
|
597
|
+
|
|
598
|
+
#### PATCH /gigs/:id (Owner Only)
|
|
599
|
+
|
|
600
|
+
```json
|
|
601
|
+
// Request (any subset)
|
|
602
|
+
{
|
|
603
|
+
"title": "Updated Gig Title",
|
|
604
|
+
"price": 1.00,
|
|
605
|
+
"terms": "Updated terms...",
|
|
606
|
+
"status": "paused",
|
|
607
|
+
"review_timeout": 86400,
|
|
608
|
+
"task_timeout": 86400, // seconds before a held task expires; null disables expiry
|
|
609
|
+
"tags": ["reddit", "q3-launch"], // arbitrary free-form strings; replaces the full list
|
|
610
|
+
"join_policy": "invite", // "invite" | "open"
|
|
611
|
+
"distribution": "random",
|
|
612
|
+
"default_rate_limit_count": 5, // worker rate limit default: N proofs per M minutes; set both null to remove
|
|
613
|
+
"default_rate_limit_minutes": 60,
|
|
614
|
+
"requires_approval": true,
|
|
615
|
+
"min_payout": 1,
|
|
616
|
+
"location": { "country": "US" },
|
|
617
|
+
"notes": "Updated internal notes",
|
|
618
|
+
"proof_webhook_url": "https://...",
|
|
619
|
+
"contract_address": "0x..."
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
// Response
|
|
623
|
+
{ "success": true }
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
#### Worker Rate Limits (default_rate_limit_count / default_rate_limit_minutes)
|
|
627
|
+
|
|
628
|
+
Optional per-worker throttle: each gigworker may take at most **N proofs per M minutes**. "Take" counts both proofs submitted and queue tasks claimed via `/queue/poll` that aren't proven yet — so a worker can't hoard the FIFO queue by claiming ahead. Default is no limit.
|
|
629
|
+
|
|
630
|
+
- Set the gig-wide default with `default_rate_limit_count` + `default_rate_limit_minutes` (both positive integers, or both `null` to disable).
|
|
631
|
+
- Override per worker via `PATCH /gigs/:id/mailboxes/:mbx_id` with `rate_limit_count` + `rate_limit_minutes` (owner only; both `null` reverts the mailbox to the gig default).
|
|
632
|
+
- When a worker is at their limit, `/queue/poll` and `POST /gigs/:id/proofs` return `429` with a human-readable `error` (stating the limit and wait time) plus a `rate_limit` object: `{ count, minutes, source: "gig"|"mailbox", used, remaining, retry_at }`.
|
|
633
|
+
- Submitting a proof for a queue task you already claimed is never blocked — the claim was already counted at poll time.
|
|
634
|
+
|
|
635
|
+
#### Task Expiry (task_timeout)
|
|
636
|
+
|
|
637
|
+
Set `task_timeout` (seconds) on a gig to give workers a deadline: once a task is claimed (queue gigs) or delivered (push gigs), the worker must submit a proof — or act on it (report/skip) — before the deadline. Default is `null`: tasks never expire.
|
|
638
|
+
|
|
639
|
+
- Expired tasks are blocked server-side: proof submission, skip, and report return `410 Gone`.
|
|
640
|
+
- Unclaimed queue items never expire — the clock starts at claim/delivery.
|
|
641
|
+
- Task listings (`GET /mailboxes/:mbxId/inbound`, dashboard inbound) include `expires_at` and `expired` per task.
|
|
642
|
+
- The owner resolves expired tasks with the endpoints below (also usable before expiry).
|
|
643
|
+
|
|
644
|
+
#### POST /gigs/:id/tasks/:msgId/extend (Owner Only)
|
|
645
|
+
|
|
646
|
+
Resets the task's expiry clock, flipping it back to not-expired in the worker's mailbox.
|
|
647
|
+
|
|
648
|
+
```json
|
|
649
|
+
// Response
|
|
650
|
+
{ "success": true, "expires_at": "2026-07-16T12:00:00.000Z", "expired": false }
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
#### POST /gigs/:id/tasks/:msgId/recycle (Owner Only)
|
|
654
|
+
|
|
655
|
+
Takes the task back from its current worker and redistributes it: queue gigs return it to the queue for the next worker (the previous holder won't receive it again); push gigs reassign it to another mailbox per the gig's distribution mode.
|
|
656
|
+
|
|
657
|
+
```json
|
|
658
|
+
// Response (queue gig)
|
|
659
|
+
{ "success": true, "requeued": true }
|
|
660
|
+
|
|
661
|
+
// Response (push gig)
|
|
662
|
+
{ "success": true, "reassigned_to": "01HX...", "reassigned_to_name": "Worker name" }
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
#### POST /gigs/:id/rotate-token (Owner Only)
|
|
666
|
+
|
|
667
|
+
```json
|
|
668
|
+
// Response
|
|
669
|
+
{
|
|
670
|
+
"email": "GIG_01HX..._newtoken.dollar-platoon@fwd.zoomgtm.com",
|
|
671
|
+
"webhook": "https://dollarplatoon.com/api/inbound/webhook/GIG_01HX...?token=newtoken"
|
|
672
|
+
}
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
Generates a new 6-char security token. Invalidates old email address and webhook URL. Old email lookup is deleted and replaced. Update all publisher integrations with the new URLs after rotating.
|
|
676
|
+
|
|
677
|
+
#### GET /gigs/:id/dashboard (Owner Only)
|
|
678
|
+
|
|
679
|
+
```json
|
|
680
|
+
// Response
|
|
681
|
+
{
|
|
682
|
+
"gig": { ... },
|
|
683
|
+
"mailboxes": [ ... ],
|
|
684
|
+
"proofs": [ ... ],
|
|
685
|
+
"rollups": [ ... ],
|
|
686
|
+
"inbound_messages": [ ... ]
|
|
687
|
+
}
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
Syncs on-chain balance on every load. Signs all S3 URLs for proof attachments.
|
|
691
|
+
|
|
692
|
+
#### POST /gigs/:id/deposit
|
|
693
|
+
|
|
694
|
+
```json
|
|
695
|
+
// Request
|
|
696
|
+
{ "wallet_alias_id": "alias_id", "amount": 100 }
|
|
697
|
+
|
|
698
|
+
// Response
|
|
699
|
+
{ "tx_hash": "0x...", "available_funds": 100 }
|
|
700
|
+
```
|
|
701
|
+
|
|
702
|
+
Deposits USDC from your hot wallet to the gig's on-chain balance. Remember to budget 110% of expected payouts to cover the platform fee.
|
|
703
|
+
|
|
704
|
+
### Mailboxes
|
|
705
|
+
|
|
706
|
+
| Method | Path | Auth | Description |
|
|
707
|
+
|--------|------|------|-------------|
|
|
708
|
+
| POST | `/gigs/:id/mailboxes` | Yes | Join gig (create mailbox) |
|
|
709
|
+
| GET | `/gigs/:id/mailboxes` | Yes | List mailboxes in gig (owner only) |
|
|
710
|
+
| PATCH | `/gigs/:id/mailboxes/:mbx_id` | Yes | Update mailbox (owner: priority/status; worker: tags) |
|
|
711
|
+
| DELETE | `/gigs/:id/mailboxes/:mbx_id` | Yes | Leave gig / remove mailbox |
|
|
712
|
+
| GET | `/mailboxes/mine` | Yes | List user's mailboxes across all gigs (`?tag=` substring filter) |
|
|
713
|
+
| GET | `/mailboxes/:mbxId/inbound` | Yes | Fetch inbound messages for mailbox |
|
|
714
|
+
| POST | `/gigs/:id/mailboxes/:mbxId/regenerate-token` | Yes | Regenerate share token |
|
|
715
|
+
|
|
716
|
+
#### POST /gigs/:id/mailboxes (Join Gig)
|
|
717
|
+
|
|
718
|
+
```json
|
|
719
|
+
// Request
|
|
720
|
+
{
|
|
721
|
+
"name": "John's Mailbox",
|
|
722
|
+
"email": "john@example.com",
|
|
723
|
+
"invite": "a1b2c3d4e5f6", // required for join_policy "invite" gigs — token from the invite link
|
|
724
|
+
"wallet_address": "0x...", // optional, auto-provisions hot wallet if omitted
|
|
725
|
+
"webhook": "https://...", // optional, for webhook task delivery
|
|
726
|
+
"notes": "I have experience with Reddit marketing",
|
|
727
|
+
"location": { "country": "US" },
|
|
728
|
+
"tags": ["urgent", "linkedin-batch"] // optional, free-form private labels (max 25 tags, 256 chars each)
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
// Response
|
|
732
|
+
{
|
|
733
|
+
"mailbox": {
|
|
734
|
+
"id": "01HX...",
|
|
735
|
+
"name": "John's Mailbox",
|
|
736
|
+
"gig_id": "GIG_01HX...",
|
|
737
|
+
"status": "active" // or "pending_approval" if gig.requires_approval
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
```
|
|
741
|
+
|
|
742
|
+
Validates reputation thresholds. Auto-creates wallet alias for external wallets. Gigs with `join_policy: "invite"` reject joins without a valid invite token (403); email-bound invites must match your account email and skip owner approval. Legacy gigs without a join_policy remain open joins.
|
|
743
|
+
|
|
744
|
+
#### PATCH /gigs/:id/mailboxes/:mbx_id
|
|
745
|
+
|
|
746
|
+
```json
|
|
747
|
+
// Request (gig owner)
|
|
748
|
+
{ "priority": 5, "status": "active", "rate_limit_count": 5, "rate_limit_minutes": 60 }
|
|
749
|
+
|
|
750
|
+
// Request (mailbox worker)
|
|
751
|
+
{ "tags": ["urgent", "linkedin-batch"] }
|
|
752
|
+
|
|
753
|
+
// Response
|
|
754
|
+
{ "success": true, "status": "active", "tags": ["urgent", "linkedin-batch"] }
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
Owner can set `priority`, `status` (`"active"` to approve a pending mailbox, `"inactive"` to disable it), and a per-worker rate limit override: `rate_limit_count` + `rate_limit_minutes` (max N proofs/claims per M minutes; both positive integers, or both `null` to revert to the gig's `default_rate_limit_*`). The mailbox's worker can set `tags` — arbitrary free-form labels for organizing their inbox (replaces the full list; max 25 tags, 256 chars each). Tags are private to the worker: they are never returned to the gig owner via `GET /gigs/:id/mailboxes`.
|
|
758
|
+
|
|
759
|
+
#### GET /mailboxes/mine
|
|
760
|
+
|
|
761
|
+
```json
|
|
762
|
+
// Response
|
|
763
|
+
{
|
|
764
|
+
"mailboxes": [
|
|
765
|
+
{
|
|
766
|
+
"id": "...", "name": "...", "gig_id": "GIG_...", "status": "active",
|
|
767
|
+
"gig_title": "...", "gig_email": "...", "owner_email": "...", "owner_display_name": "...",
|
|
768
|
+
"tasks_received": 12, "proofs_submitted": 10, "response_rate": 0.83,
|
|
769
|
+
"tags": ["urgent", "linkedin-batch"]
|
|
770
|
+
}
|
|
771
|
+
]
|
|
772
|
+
}
|
|
773
|
+
```
|
|
774
|
+
|
|
775
|
+
Supports `?tag=` filtering by case-insensitive **substring** match against your tags — `?tag=link` matches a mailbox tagged `"linkedin-batch"`. Comma-separated values are OR'd: `?tag=urgent,linkedin`.
|
|
776
|
+
|
|
777
|
+
#### GET /mailboxes/:mbxId/inbound
|
|
778
|
+
|
|
779
|
+
```json
|
|
780
|
+
// Response
|
|
781
|
+
{
|
|
782
|
+
"inbound_messages": [
|
|
783
|
+
{
|
|
784
|
+
"id": "...", "type": "email", "subject": "...", "from": "sender@example.com",
|
|
785
|
+
"payload": "...", "mailbox_id": "...", "forwarded_at": "...",
|
|
786
|
+
"attachments": [{ "filename": "...", "content_type": "...", "url": "https://..." }]
|
|
787
|
+
}
|
|
788
|
+
]
|
|
789
|
+
}
|
|
790
|
+
```
|
|
791
|
+
|
|
792
|
+
### Proofs
|
|
793
|
+
|
|
794
|
+
| Method | Path | Auth | Description |
|
|
795
|
+
|--------|------|------|-------------|
|
|
796
|
+
| POST | `/gigs/:id/proofs` | Yes | Submit proof of work |
|
|
797
|
+
| GET | `/gigs/:id/proofs` | Yes | List proofs (filterable by status) |
|
|
798
|
+
| GET | `/gigs/:id/proofs/:proof_id` | Yes | Get proof detail |
|
|
799
|
+
| PATCH | `/gigs/:id/proofs/:proof_id` | Yes | Approve or reject proof (owner only) |
|
|
800
|
+
| POST | `/gigs/:id/proofs/:proof_id/report` | Yes | Report auto-approved proof (owner only) |
|
|
801
|
+
|
|
802
|
+
#### POST /gigs/:id/proofs (Submit Proof)
|
|
803
|
+
|
|
804
|
+
```json
|
|
805
|
+
// Request
|
|
806
|
+
{
|
|
807
|
+
"mailbox_id": "01HX...",
|
|
808
|
+
"task_identifier": "reddit-thread-abc123",
|
|
809
|
+
"proofs": ["https://reddit.com/r/...", "https://s3.amazonaws.com/..."]
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
// Response
|
|
813
|
+
{
|
|
814
|
+
"proof": {
|
|
815
|
+
"id": "01HX...",
|
|
816
|
+
"status": "pending",
|
|
817
|
+
"timeout_at": "2026-02-18T..."
|
|
818
|
+
},
|
|
819
|
+
"warning": "Warning: gig available funds are less than the task price"
|
|
820
|
+
}
|
|
821
|
+
```
|
|
822
|
+
|
|
823
|
+
**`task_identifier` is critical.** This field links a proof to the specific task it fulfills.
|
|
824
|
+
- For **`queue` gigs**, pass the polled task's `id` (the inbound message ULID returned by `/queue/poll`). The server uses this to atomically claim the queue item out of the queue to your mailbox.
|
|
825
|
+
- For **`inbound_proof` gigs** and other distribution modes, use the task's unique reference (URL, ticket ID, publisher-supplied `task_id`, etc.).
|
|
826
|
+
- **Avoid using the subject line** — subjects are rarely unique, and collisions cause duplicate-submission 409s.
|
|
827
|
+
|
|
828
|
+
The `warning` field appears when the gig's `available_funds` is less than the task price. The proof is still accepted, but payout will fail until the client deposits more funds.
|
|
829
|
+
|
|
830
|
+
Price is locked at submission time (`locked_price`).
|
|
831
|
+
|
|
832
|
+
#### PATCH /gigs/:id/proofs/:proof_id (Review)
|
|
833
|
+
|
|
834
|
+
```json
|
|
835
|
+
// Request (approve)
|
|
836
|
+
{ "action": "approve", "feedback": "Great work!" }
|
|
837
|
+
|
|
838
|
+
// Request (reject)
|
|
839
|
+
{ "action": "reject", "feedback": "Screenshot doesn't match", "rejection_tag": "incomplete" }
|
|
840
|
+
|
|
841
|
+
// Response
|
|
842
|
+
{ "success": true, "status": "approved" }
|
|
843
|
+
```
|
|
844
|
+
|
|
845
|
+
Rejection tags (required when rejecting): `low_quality`, `incomplete`, `fake_proof`, `duplicate`, `unresponsive`, `other`
|
|
846
|
+
|
|
847
|
+
Rejection weights (reputation impact): fake_proof=5x, duplicate=3x, incomplete=2x, unresponsive=2x, low_quality=1x, other=1x
|
|
848
|
+
|
|
849
|
+
#### POST /gigs/:id/proofs/:proof_id/report (Owner Only)
|
|
850
|
+
|
|
851
|
+
```json
|
|
852
|
+
// Response
|
|
853
|
+
{ "success": true, "status": "reported" }
|
|
854
|
+
```
|
|
855
|
+
|
|
856
|
+
Only works on `timeout_approved` proofs. Reported proofs are excluded from rollups and will not be paid.
|
|
857
|
+
|
|
858
|
+
### Rollups (Payouts)
|
|
859
|
+
|
|
860
|
+
| Method | Path | Auth | Description |
|
|
861
|
+
|--------|------|------|-------------|
|
|
862
|
+
| GET | `/gigs/:id/rollups` | Yes | List rollups for gig |
|
|
863
|
+
| POST | `/gigs/:id/rollups` | Yes | Trigger manual rollup (owner only) |
|
|
864
|
+
| GET | `/rollups/mine` | Yes | List rollups across user's mailboxes |
|
|
865
|
+
|
|
866
|
+
#### POST /gigs/:id/rollups (Trigger Payout)
|
|
867
|
+
|
|
868
|
+
```json
|
|
869
|
+
// Response
|
|
870
|
+
{
|
|
871
|
+
"rollups": [
|
|
872
|
+
{
|
|
873
|
+
"id": "...",
|
|
874
|
+
"mailbox_id": "...",
|
|
875
|
+
"wallet_address": "0x...",
|
|
876
|
+
"proof_ids": ["...", "..."],
|
|
877
|
+
"gross_amount": 5.00,
|
|
878
|
+
"platform_fee": 0.50,
|
|
879
|
+
"net_amount": 5.00,
|
|
880
|
+
"tx_hash": "0x...",
|
|
881
|
+
"status": "paid"
|
|
882
|
+
}
|
|
883
|
+
],
|
|
884
|
+
"available_funds": 44.50,
|
|
885
|
+
"skipped_below_minimum": [
|
|
886
|
+
{ "mailbox_id": "...", "amount": 0.50 }
|
|
887
|
+
]
|
|
888
|
+
}
|
|
889
|
+
```
|
|
890
|
+
|
|
891
|
+
Groups approved + timeout_approved proofs by mailbox. Pre-checks `available_funds >= gross_amount + platform_fee` (no debt allowed). Worker receives full `gross_amount`. Skips mailboxes below `min_payout` threshold.
|
|
892
|
+
|
|
893
|
+
**Will return 400 error if the gig cannot cover the total cost (gross + 10% fee).**
|
|
894
|
+
|
|
895
|
+
### Inbound (Task Distribution)
|
|
896
|
+
|
|
897
|
+
| Method | Path | Auth | Description |
|
|
898
|
+
|--------|------|------|-------------|
|
|
899
|
+
| POST | `/inbound/email` | No | Resend inbound email webhook |
|
|
900
|
+
| POST | `/inbound/webhook/:gig_id` | No | Publisher webhook task delivery |
|
|
901
|
+
|
|
902
|
+
#### POST /inbound/webhook/:gig_id?token=...
|
|
903
|
+
|
|
904
|
+
**This is the preferred endpoint for AI agents and publisher apps to deliver tasks.** Accepts **JSON** (default) or **HTML/plain text** payloads. Content-Type header determines parsing.
|
|
905
|
+
|
|
906
|
+
**For AI agents:** Use `Content-Type: text/html` with the dual-format HTML pattern (see "Dual-Format HTML" section above) to deliver tasks that work for both human gigworkers and AI agents. Include a hidden `div.agent-data` with `data-agent-json` for structured data extraction.
|
|
907
|
+
|
|
908
|
+
**JSON payload (Content-Type: application/json):**
|
|
909
|
+
|
|
910
|
+
```json
|
|
911
|
+
// Request
|
|
912
|
+
{ "task": "Comment on this Reddit thread", "url": "https://..." }
|
|
913
|
+
|
|
914
|
+
// Response
|
|
915
|
+
{ "status": "forwarded", "targets": 3 }
|
|
916
|
+
```
|
|
917
|
+
|
|
918
|
+
**HTML payload (Content-Type: text/html or text/plain) — recommended for mixed human+agent gigs:**
|
|
919
|
+
|
|
920
|
+
```bash
|
|
921
|
+
curl -X POST "https://dollarplatoon.com/api/inbound/webhook/GIG_01HX...?token=abc123&subject=My+Report" \
|
|
922
|
+
-H "Content-Type: text/html" \
|
|
923
|
+
-d '<h1>Task Details</h1><p>Please complete this task...</p>'
|
|
924
|
+
```
|
|
925
|
+
|
|
926
|
+
```json
|
|
927
|
+
// Response
|
|
928
|
+
{ "status": "forwarded", "targets": 3 }
|
|
929
|
+
```
|
|
930
|
+
|
|
931
|
+
When HTML/text is sent, the message is stored with `type: "email"` and rendered as formatted HTML on the frontend (same as email-sourced tasks). An optional `subject` query parameter can be included to set the message subject line.
|
|
932
|
+
|
|
933
|
+
Requires valid `token` query parameter matching the gig's security token. Returns 403 if token is invalid. Selects mailboxes via distribution algorithm, forwards payload to each mailbox webhook.
|
|
934
|
+
|
|
935
|
+
**Distribution Modes:**
|
|
936
|
+
|
|
937
|
+
- **round_robin** — Cursor-based fair rotation through active mailboxes
|
|
938
|
+
- **random** — Uniform random selection
|
|
939
|
+
- **priority_weighted** — Weighted by mailbox priority (1-10, higher = more tasks)
|
|
940
|
+
- **free_for_all** — All active mailboxes receive the task
|
|
941
|
+
- **queue** — Tasks stored in a shared queue; workers poll and claim tasks on-demand
|
|
942
|
+
- **inbound_proof** — No tasks distributed; workers submit proofs directly without task assignment
|
|
943
|
+
|
|
944
|
+
### Queue (FIFO)
|
|
945
|
+
|
|
946
|
+
| Method | Path | Auth | Description |
|
|
947
|
+
|--------|------|------|-------------|
|
|
948
|
+
| POST | `/gigs/:id/queue/poll` | Yes | Poll for available tasks (gigworker, queue gigs only) |
|
|
949
|
+
| POST | `/gigs/:id/queue/:msgId/decline` | Yes | Skip a task so future polls don't return it to you (per-worker, does not hide from other workers) |
|
|
950
|
+
| GET | `/gigs/:id/queue` | Yes | List queued tasks (owner sees `declined_count` per item) |
|
|
951
|
+
| DELETE | `/gigs/:id/tasks/:taskId` | Yes | Delete a stored task/inbound message (gig owner only) |
|
|
952
|
+
|
|
953
|
+
#### POST /gigs/:id/queue/poll
|
|
954
|
+
|
|
955
|
+
```json
|
|
956
|
+
// Request
|
|
957
|
+
{ "count": 2 } // optional, default 2, max 20
|
|
958
|
+
|
|
959
|
+
// Response
|
|
960
|
+
{
|
|
961
|
+
"tasks": [
|
|
962
|
+
{
|
|
963
|
+
"id": "...", "type": "webhook", "subject": "...",
|
|
964
|
+
"payload": "...", "forwarded_at": "..."
|
|
965
|
+
}
|
|
966
|
+
],
|
|
967
|
+
"count": 1,
|
|
968
|
+
"rate_limit": { "count": 5, "minutes": 60, "source": "gig", "used": 3, "remaining": 2, "retry_at": null } // null if no limit configured
|
|
969
|
+
}
|
|
970
|
+
```
|
|
971
|
+
|
|
972
|
+
For `queue` gigs only. Returns unclaimed queued tasks in the configured queue order, skipping items you've already submitted a proof for or declined. Tasks are not forwarded to mailboxes — gigworkers must poll to claim them.
|
|
973
|
+
|
|
974
|
+
If the gig (or your mailbox specifically) has a worker rate limit, polling past it returns `429` with an `error` message stating the limit and how long to wait, plus the same `rate_limit` object with `retry_at` set. Claims are capped to your remaining allowance — e.g. requesting 10 tasks with 2 remaining returns at most 2.
|
|
975
|
+
|
|
976
|
+
#### POST /gigs/:id/queue/:msgId/decline
|
|
977
|
+
|
|
978
|
+
Marks a queue item as skipped *for the calling worker only*. Idempotent. Returns `{"success": true}`.
|
|
979
|
+
|
|
980
|
+
Use this when a polled task isn't suitable for you (spam, duplicate, ineligible, etc.) so future polls return fresh items instead of the same ones at the head of the FIFO queue. Other workers still see the item. The gig owner sees a `declined_count` on their dashboard so they can prune genuinely unworkable items.
|
|
981
|
+
|
|
982
|
+
**For Gigworkers (Queue gigs):**
|
|
983
|
+
|
|
984
|
+
- Tasks are NOT forwarded to your mailbox. Instead, use "Poll New Tasks" in the UI or call `POST /gigs/:id/queue/poll` to claim tasks from the shared queue.
|
|
985
|
+
- Tasks are returned in the configured queue order (FIFO or LIFO) and filtered against proofs you've already submitted or items you've declined.
|
|
986
|
+
- After polling, submit proofs via `POST /gigs/:id/proofs` using the polled task's `id` as `task_identifier` — this atomically claims the queue item into your mailbox.
|
|
987
|
+
- If a task isn't suitable, call `POST /gigs/:id/queue/:msgId/decline` to skip it. Declining is free and doesn't affect other workers.
|
|
988
|
+
|
|
989
|
+
### Public (No Auth Required)
|
|
990
|
+
|
|
991
|
+
| Method | Path | Auth | Description |
|
|
992
|
+
|--------|------|------|-------------|
|
|
993
|
+
| GET | `/public/mailbox-info?token=...` | No | Get mailbox info via share token |
|
|
994
|
+
| POST | `/public/upload-presign` | No | Get S3 presigned upload URL |
|
|
995
|
+
| POST | `/public/submit-proof` | No | Submit proof via public share link |
|
|
996
|
+
| GET | `/public/read-url?key=...&token=...` | No | Get presigned S3 read URL |
|
|
997
|
+
|
|
998
|
+
Rate limited: 10-30 requests/min per share token.
|
|
999
|
+
|
|
1000
|
+
#### POST /public/submit-proof
|
|
1001
|
+
|
|
1002
|
+
```json
|
|
1003
|
+
// Request
|
|
1004
|
+
{
|
|
1005
|
+
"share_token": "tok_...",
|
|
1006
|
+
"task_identifier": "reddit-thread-abc123",
|
|
1007
|
+
"proofs": ["https://..."]
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
// Response
|
|
1011
|
+
{ "proof_id": "...", "status": "pending" }
|
|
1012
|
+
```
|
|
1013
|
+
|
|
1014
|
+
### Reviews
|
|
1015
|
+
|
|
1016
|
+
| Method | Path | Auth | Description |
|
|
1017
|
+
|--------|------|------|-------------|
|
|
1018
|
+
| POST | `/gigs/:id/reviews` | Yes | Leave star review (1-5) |
|
|
1019
|
+
| PATCH | `/reviews/:id/resolve` | Yes | Mark review as resolved (reviewer only) |
|
|
1020
|
+
| GET | `/reputation/:wallet/reviews` | No | List reviews for wallet |
|
|
1021
|
+
|
|
1022
|
+
#### POST /gigs/:id/reviews
|
|
1023
|
+
|
|
1024
|
+
```json
|
|
1025
|
+
// Request
|
|
1026
|
+
{ "target_wallet": "0x...", "stars": 4, "comment": "Reliable worker, good quality" }
|
|
1027
|
+
|
|
1028
|
+
// Response
|
|
1029
|
+
{ "review": { "id": "...", "stars": 4 } }
|
|
1030
|
+
```
|
|
1031
|
+
|
|
1032
|
+
One review per reviewer-target pair per gig. Reviewer role auto-detected (client if owner, gigworker otherwise).
|
|
1033
|
+
|
|
1034
|
+
### Reputation
|
|
1035
|
+
|
|
1036
|
+
| Method | Path | Auth | Description |
|
|
1037
|
+
|--------|------|------|-------------|
|
|
1038
|
+
| GET | `/reputation/:wallet` | No | Get computed reputation score |
|
|
1039
|
+
| GET | `/reputation/alias/:alias_id` | No | Get reputation by wallet alias |
|
|
1040
|
+
| GET | `/reputation/:wallet/events` | No | List raw reputation events |
|
|
1041
|
+
|
|
1042
|
+
#### GET /reputation/:wallet
|
|
1043
|
+
|
|
1044
|
+
```json
|
|
1045
|
+
// Response
|
|
1046
|
+
{
|
|
1047
|
+
"wallet": "0x...",
|
|
1048
|
+
"volume": 150.50,
|
|
1049
|
+
"quality": 0.92,
|
|
1050
|
+
"recency": 0.85,
|
|
1051
|
+
"social": 4.2,
|
|
1052
|
+
"event_count": 47
|
|
1053
|
+
}
|
|
1054
|
+
```
|
|
1055
|
+
|
|
1056
|
+
### Wallets
|
|
1057
|
+
|
|
1058
|
+
| Method | Path | Auth | Description |
|
|
1059
|
+
|--------|------|------|-------------|
|
|
1060
|
+
| POST | `/wallets` | Yes | Create wallet alias |
|
|
1061
|
+
| GET | `/wallets` | Yes | List user's wallet aliases |
|
|
1062
|
+
| GET | `/wallets/:alias_id` | Yes | Get wallet detail |
|
|
1063
|
+
| GET | `/wallets/:alias_id/balances` | Yes | Get on-chain balances (ETH + USDC) |
|
|
1064
|
+
| POST | `/wallets/:alias_id/transfer` | Yes | Transfer USDC from hot wallet |
|
|
1065
|
+
| DELETE | `/wallets/:alias_id` | Yes | Delete wallet alias |
|
|
1066
|
+
|
|
1067
|
+
#### POST /wallets
|
|
1068
|
+
|
|
1069
|
+
```json
|
|
1070
|
+
// Request (hot wallet — platform-managed)
|
|
1071
|
+
{ "label": "My Hot Wallet", "is_hot_wallet": true }
|
|
1072
|
+
|
|
1073
|
+
// Request (external wallet — self-custody)
|
|
1074
|
+
{ "label": "My MetaMask", "is_hot_wallet": false, "evm_address": "0x..." }
|
|
1075
|
+
|
|
1076
|
+
// Response
|
|
1077
|
+
{ "wallet": { "alias_id": "...", "label": "My Hot Wallet", "is_hot_wallet": true, "created_at": "..." } }
|
|
1078
|
+
```
|
|
1079
|
+
|
|
1080
|
+
One hot wallet per user. External wallets are unlimited.
|
|
1081
|
+
|
|
1082
|
+
#### GET /wallets/:alias_id/balances
|
|
1083
|
+
|
|
1084
|
+
```json
|
|
1085
|
+
// Response
|
|
1086
|
+
{ "evm_address": "0x...", "eth_balance": "0.05", "usdc_balance": "100.000000" }
|
|
1087
|
+
```
|
|
1088
|
+
|
|
1089
|
+
#### POST /wallets/:alias_id/transfer
|
|
1090
|
+
|
|
1091
|
+
```json
|
|
1092
|
+
// Request
|
|
1093
|
+
{ "to_address": "0x...", "amount": 50 }
|
|
1094
|
+
|
|
1095
|
+
// Response
|
|
1096
|
+
{ "tx_hash": "0x..." }
|
|
1097
|
+
```
|
|
1098
|
+
|
|
1099
|
+
Hot wallets only.
|
|
1100
|
+
|
|
1101
|
+
### Profiles
|
|
1102
|
+
|
|
1103
|
+
| Method | Path | Auth | Description |
|
|
1104
|
+
|--------|------|------|-------------|
|
|
1105
|
+
| PATCH | `/profiles/me` | Yes | Update own profile |
|
|
1106
|
+
| GET | `/profiles/:identifier` | No | Get public profile (by email or alias_id) |
|
|
1107
|
+
| GET | `/profiles/:identifier/private` | Yes | Get private profile (requires shared gig relationship) |
|
|
1108
|
+
|
|
1109
|
+
#### PATCH /profiles/me
|
|
1110
|
+
|
|
1111
|
+
```json
|
|
1112
|
+
// Request
|
|
1113
|
+
{ "display_name": "John Doe", "bio": "Experienced social media marketer", "avatar_url": "https://..." }
|
|
1114
|
+
```
|
|
1115
|
+
|
|
1116
|
+
### Upload
|
|
1117
|
+
|
|
1118
|
+
| Method | Path | Auth | Description |
|
|
1119
|
+
|--------|------|------|-------------|
|
|
1120
|
+
| POST | `/upload/presign` | Yes | Get presigned S3 upload URL |
|
|
1121
|
+
|
|
1122
|
+
```json
|
|
1123
|
+
// Request
|
|
1124
|
+
{ "filename": "screenshot.png", "content_type": "image/png", "prefix": "proofs" }
|
|
1125
|
+
|
|
1126
|
+
// Response
|
|
1127
|
+
{ "presigned_url": "https://s3...", "url": "https://s3...", "key": "proofs/...", "bucket": "..." }
|
|
1128
|
+
```
|
|
1129
|
+
|
|
1130
|
+
Prefix options: `"avatars"`, `"gig-icons"`, or `"proofs"` (default). Presigned URL expires in 1 hour.
|
|
1131
|
+
|
|
1132
|
+
### OfficeX Integration
|
|
1133
|
+
|
|
1134
|
+
| Method | Path | Auth | Description |
|
|
1135
|
+
|--------|------|------|-------------|
|
|
1136
|
+
| POST | `/officex/webhook` | No | Handle OfficeX install/uninstall |
|
|
1137
|
+
| POST | `/officex/login` | No | Login via OfficeX credentials |
|
|
1138
|
+
|
|
1139
|
+
#### POST /officex/webhook
|
|
1140
|
+
|
|
1141
|
+
```json
|
|
1142
|
+
// Request
|
|
1143
|
+
{ "event": "INSTALL", "payload": { "install_id": "...", "install_secret": "...", "user_id": "...", "app_id": "..." } }
|
|
1144
|
+
|
|
1145
|
+
// Response
|
|
1146
|
+
{ "agent_context": { "user_email": "officex-...@dollar-platoon.local", "api_key": "...", "api_url": "https://...", "install_id": "...", "install_secret": "..." } }
|
|
1147
|
+
```
|
|
1148
|
+
|
|
1149
|
+
Creates user with email `officex-{user_id}@dollar-platoon.local`. Auto-provisions hot wallet.
|
|
1150
|
+
|
|
1151
|
+
#### POST /officex/login
|
|
1152
|
+
|
|
1153
|
+
```json
|
|
1154
|
+
// Request
|
|
1155
|
+
{ "officex_user_id": "...", "officex_install_id": "..." }
|
|
1156
|
+
|
|
1157
|
+
// Response
|
|
1158
|
+
{ "email": "officex-...@dollar-platoon.local", "api_key": "..." }
|
|
1159
|
+
```
|
|
1160
|
+
|
|
1161
|
+
Returns 404 if user not found (webhook may not have fired yet). Returns 403 if install_id mismatch.
|
|
1162
|
+
|
|
1163
|
+
### Admin
|
|
1164
|
+
|
|
1165
|
+
| Method | Path | Auth | Description |
|
|
1166
|
+
|--------|------|------|-------------|
|
|
1167
|
+
| POST | `/admin/users/provision` | `x-admin-key` header | Programmatically provision (or fetch) an account |
|
|
1168
|
+
|
|
1169
|
+
#### POST /admin/users/provision
|
|
1170
|
+
|
|
1171
|
+
Idempotent. Creates the account (and auto-provisions a hot wallet) if the email is new — `201` with `"created": true`. If the account already exists, no changes are made and the existing account info is returned — `200` with `"created": false`. The API key is never rotated by this endpoint.
|
|
1172
|
+
|
|
1173
|
+
```json
|
|
1174
|
+
// Request (header: x-admin-key: <ADMIN_API_KEY>)
|
|
1175
|
+
{ "email": "user@example.com" }
|
|
1176
|
+
|
|
1177
|
+
// Response — 201 if newly created, 200 if the account already existed
|
|
1178
|
+
{
|
|
1179
|
+
"created": false,
|
|
1180
|
+
"account": {
|
|
1181
|
+
"email": "user@example.com",
|
|
1182
|
+
"api_key": "base64url_encoded_key",
|
|
1183
|
+
"display_name": null,
|
|
1184
|
+
"created_at": "2026-02-14T...",
|
|
1185
|
+
"officex_user_id": null,
|
|
1186
|
+
"officex_install_id": null
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
```
|
|
1190
|
+
|
|
1191
|
+
Returns 503 if `ADMIN_API_KEY` is not configured, 401 if the header is missing, 403 if the key is invalid.
|
|
1192
|
+
|
|
1193
|
+
### Health
|
|
1194
|
+
|
|
1195
|
+
| Method | Path | Auth | Description |
|
|
1196
|
+
|--------|------|------|-------------|
|
|
1197
|
+
| GET | `/health` | No | Health check |
|
|
1198
|
+
|
|
1199
|
+
```json
|
|
1200
|
+
{ "status": "ok", "stage": "production", "timestamp": "2026-02-14T..." }
|
|
1201
|
+
```
|
|
1202
|
+
|
|
1203
|
+
---
|
|
1204
|
+
|
|
1205
|
+
## Proof Lifecycle
|
|
1206
|
+
|
|
1207
|
+
```
|
|
1208
|
+
submitted (locked_price snapshot, timeout_at set)
|
|
1209
|
+
→ approved (client action) → rolled up → payout on-chain → paid
|
|
1210
|
+
→ rejected (requires rejection_tag + optional feedback)
|
|
1211
|
+
→ timeout_approved (daily cron, after review_timeout) → same rollup path
|
|
1212
|
+
→ reported (post-timeout flag by owner, excluded from payouts)
|
|
1213
|
+
```
|
|
1214
|
+
|
|
1215
|
+
Rejection tags: `low_quality`, `incomplete`, `fake_proof`, `duplicate`, `unresponsive`, `other`
|
|
1216
|
+
|
|
1217
|
+
---
|
|
1218
|
+
|
|
1219
|
+
## Rollup & Payout Flow
|
|
1220
|
+
|
|
1221
|
+
1. Client triggers `POST /gigs/:id/rollups` (or daily cron runs automatically)
|
|
1222
|
+
2. Groups approved proofs by mailbox, sums `locked_price` per mailbox
|
|
1223
|
+
3. Skips mailboxes below `min_payout` threshold
|
|
1224
|
+
4. Pre-checks: `gross_amount + platform_fee <= available_funds` — **fails with 400 if underfunded**
|
|
1225
|
+
5. Calls on-chain `payout(gig_id, wallet, gross_amount, rollup_id)`
|
|
1226
|
+
6. On success: stores `tx_hash`, status → `paid`, creates reputation event
|
|
1227
|
+
7. On failure: status → `failed`, retried by next daily cron run
|