⧧⧍ āĻŽā§‡, ⧍ā§Ļ⧍ā§Ģ¡6 āĻŽāĻŋāύāĻŋāϟ āĻĒāĻĄāĻŧāϤ⧇

Go-āϤ⧇ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϟ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ: āϕ⧀, āĻĄā§‡āĻĄā§āĻĒ āĻŸā§‡āĻŦāĻŋāϞ, āϰāĻŋāĻŸā§āϰāĻžāχ

Go-āϤ⧇ idempotent āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻĄāĻŋāϜāĻžāχāύ āĻ•āϰ⧁āύ: idempotency āϕ⧀, dedup āĻŸā§‡āĻŦāĻŋāϞ āĻāĻŦāĻ‚ āĻĒ⧇āĻŽā§‡āĻ¨ā§āϟ, āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ āĻ“ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āϕ⧇āϰ āϜāĻ¨ā§āϝ āϰāĻŋāĻŸā§āϰāĻžāχ-āϏ⧇āχāĻĢ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āϤ⧈āϰāĻŋ āĻ•āϰāĻŦ⧇āύāĨ¤

Go-āϤ⧇ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϟ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ: āϕ⧀, āĻĄā§‡āĻĄā§āĻĒ āĻŸā§‡āĻŦāĻŋāϞ, āϰāĻŋāĻŸā§āϰāĻžāχ

āϕ⧇āύ āϰāĻŋāĻŸā§āϰāĻžāχ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ (āĻāĻŦāĻ‚ āϕ⧇āύ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ)\n\nāϰāĻŋāĻŸā§āϰāĻžāχ āϘāĻŸā§‡ āĻāĻŽāύāĻ•āĻŋ āϝāĻ–āύ āĻ•āĻŋāϛ⧁ "āϭ⧁āϞ" āĻšāϝāĻŧ āύāĻžāĨ¤ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āϟāĻžāχāĻŽāφāωāϟ āĻĒāĻžāϝāĻŧ āϝāĻ–āύ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻāĻ–āύāĻ“ āĻ•āĻžāϜ āĻ•āϰāϛ⧇āĨ¤ āĻāĻ•āϟāĻŋ āĻŽā§‹āĻŦāĻžāχāϞ āĻ•āĻžāύ⧇āĻ•āĻļāύ āĻĒāĻĄāĻŧ⧇ āϝāĻžāϝāĻŧ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻĒ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧇āĨ¤ āĻāĻ•āϟāĻŋ āϜāĻŦ āϰāĻžāύāĻžāϰ 502 āĻĒāĻžāϝāĻŧ āĻāĻŦāĻ‚ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻāĻ•āχ āĻ…āύ⧁āϰ⧋āϧāϟāĻŋ āφāĻŦāĻžāϰ āĻĒāĻžāĻ āĻžāϝāĻŧāĨ¤ āĻ…ā§āϝāĻžāϟ-āϞāĻŋāĻ¸ā§āϟ-āĻ“āϝāĻŧāĻžāύ āĻĄā§‡āϞāĻŋāĻ­āĻžāϰāĻŋ (āĻ•āĻŋāω āĻāĻŦāĻ‚ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ•āϗ⧁āϞāĻŋāϤ⧇ āϏāĻžāϧāĻžāϰāĻŖ) āĻĨāĻžāĻ•āϞ⧇ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•āĨ¤\n\nāĻāĻŽāύāχ āĻ•āĻžāϰāϪ⧇ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ: āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤ āĻ…āύ⧁āϰ⧋āϧāϗ⧁āϞ⧋ āϕ⧇āĻŦāϞ āĻāĻ•āĻŦāĻžāϰ āĻ•āϞ āĻ•āϰāĻžāϰ āĻŽāϤ⧋āχ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻĢāϞāĻžāĻĢāϞ āĻĻ⧇āĻ“āϝāĻŧāĻž āωāϚāĻŋāϤāĨ¤\n\nāĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻļāĻŦā§āĻĻ āϏāĻšāĻœā§‡āχ āϗ⧁āϞāĻŋāϝāĻŧ⧇ āĻĢ⧇āϞāĻž āϝāĻžāϝāĻŧ:\n\n- Safe: āĻ•āϞ āĻ•āϰāϞ⧇ āĻ¸ā§āĻŸā§‡āϟ āĻŦāĻĻāϞāĻžāϝāĻŧ āύāĻž (āωāĻĻāĻžāĻšāϰāĻŖ, āĻāĻ•āϟāĻŋ āĻĒāĻĄāĻŧāĻž)āĨ¤\n- Idempotent: āĻāĻ•āĻžāϧāĻŋāĻ•āĻŦāĻžāϰ āĻ•āϞ āĻ•āϰāϞ⧇ āĻāĻ•āĻŦāĻžāϰ āĻ•āϞ āĻ•āϰāĻžāϰ āϏāĻŽāĻžāύ āĻĒā§āϰāĻ­āĻžāĻŦ āϰāĻžāϖ⧇āĨ¤\n- At-least-once: āĻĒāĻžāĻ āĻ• āϝāϤāĻ•ā§āώāĻŖ āύāĻž “āϚāĻžāĻ™ā§āĻ—āĻžâ€ āĻšāϝāĻŧ āϤāϤāĻ•ā§āώāĻŖ āϏ⧇āĻ¨ā§āϟāĻžāϰ āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋ āĻ•āϰ⧇, āϤāĻžāχ āϰāĻŋāϏāĻŋāĻ­āĻžāϰ⧇āϰ āĻ•āĻžāϛ⧇ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞ āĻ•āϰāĻžāϰ āĻĻāĻžāϝāĻŧ āĻĨāĻžāϕ⧇āĨ¤\n\nāφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āύāĻž āĻĨāĻžāĻ•āϞ⧇ āϰāĻŋāĻŸā§āϰāĻžāχ āĻĒā§āϰāĻ•ā§ƒāϤ āĻ•ā§āώāϤāĻŋ āϘāϟāĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāĻ•āϟāĻŋ āĻĒ⧇āĻŽā§‡āĻ¨ā§āϟ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻĻ⧁āϟāĻŋ āϚāĻžāĻ°ā§āϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻĻāĻŋ āĻĒā§āϰāĻĨāĻŽ āϚāĻžāĻ°ā§āϜ āϏāĻĢāϞ āĻšāϝāĻŧ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻĒ⧌āρāĻ›āĻžāϝāĻŧ āύāĻžāĨ¤ āĻāĻ•āϟāĻŋ āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻ•āĻžāϜāϟāĻŋ āϟāĻžāχāĻŽāφāωāĻŸā§‡āϰ āĻĒāϰ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāϞ⧇ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϏāĻžāϰāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāĻ•āϟāĻŋ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ āĻāĻ•āχ āχāϭ⧇āĻ¨ā§āϟ āĻĻ⧁āχāĻŦāĻžāϰ āĻĒā§āϰāϏ⧇āϏ āĻ•āϰ⧇ āĻĻ⧁āϟāĻŋ āχāĻŽā§‡āχāϞ āĻĒāĻžāĻ āĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤\n\nāĻŽā§‚āϞ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ: āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āĻāĻ•āϟāĻŋ API āϚ⧁āĻ•ā§āϤāĻŋ, āĻāĻ•āϟāĻŋ āĻ—ā§‹āĻĒāύ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ āĻŦāĻŋāĻŦāϰāĻŖ āύāϝāĻŧāĨ¤ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāϰāĻž āϜāĻžāύāϤ⧇ āĻšāĻŦ⧇ āϕ⧀ āϤāĻžāϰāĻž āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āϕ⧀ āĻĒāĻžāĻ āĻžāϤ⧇ āĻšāĻŦ⧇, āĻāĻŦāĻ‚ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϧāϰāĻž āĻĒāĻĄāĻŧāϞ⧇ āϕ⧀ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āφāĻļāĻž āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āφāϚāϰāĻŖ āύāĻŋāĻ°ā§āĻŦāĻŋāĻ˜ā§āύ⧇ āĻŦāĻĻāϞāĻžāύ, āϤāĻžāĻšāϞ⧇ āϰāĻŋāĻŸā§āϰāĻžāχ āϞāϜāĻŋāĻ• āϭ⧇āϙ⧇ āĻĒāĻĄāĻŧ⧇ āĻāĻŦāĻ‚ āύāϤ⧁āύ āĻŦā§āϝāĻ°ā§āĻĨāϤāĻžāϰ āωāĻĒāĻžāϝāĻŧ āϤ⧈āϰāĻŋ āĻšāϝāĻŧāĨ¤\n\nāφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āĻŽāύāĻŋāϟāϰāĻŋāĻ‚ āĻ“ āϰāĻŋāĻ•āύāϏāĻŋāϞāĻŋāϝāĻŧ⧇āĻļāύ⧇āϰ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āύāϝāĻŧāĨ¤ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϰ⧇āϟ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰ⧁āύ, “replay” āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āϞāĻ— āĻ•āϰ⧁āύ, āĻāĻŦāĻ‚ āϏāĻŽāϝāĻŧ⧇ āϏāĻŽāϝāĻŧ⧇ āĻŦāĻžāχāϰ⧇āϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ (āϝ⧇āĻŽāύ āĻāĻ•āϟāĻŋ āĻĒ⧇āĻŽā§‡āĻ¨ā§āϟ āĻĒā§āϰ⧋āĻ­āĻžāχāĻĄāĻžāϰ) āφāĻĒāύāĻžāϰ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ⧇āϰ āϏāĻžāĻĨ⧇ āĻŽāĻŋāϞāĻŋāϝāĻŧ⧇ āĻĻ⧇āϖ⧁āύāĨ¤\n\n## āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋāϰ āĻ¸ā§āϕ⧋āĻĒ āĻāĻŦāĻ‚ āύāĻŋāϝāĻŧāĻŽ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧁āύ\n\nāĻŸā§‡āĻŦāĻŋāϞ āĻŦāĻž āĻŽāĻŋāĻĄāϞāĻ“āϝāĻŧā§āϝāĻžāϰ āϝ⧋āĻ— āĻ•āϰāĻžāϰ āφāϗ⧇ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāύ “āĻāĻ•āχ āĻ…āύ⧁āϰ⧋āĻ§â€ āϕ⧀ āĻŦā§‹āĻāĻžāϝāĻŧ āĻāĻŦāĻ‚ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āϝāĻ–āύ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϕ⧀ āĻĒā§āϰāϤāĻŋāĻļā§āϰ⧁āϤāĻŋ āĻĻ⧇āĻŦ⧇āĨ¤\n\nāĻŦ⧇āĻļāĻŋ āϏāĻŽāĻ¸ā§āϝāĻž POST-āĻ āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧ āĻ•āĻžāϰāĻŖ āĻāϟāĻŋ āĻĒā§āϰāĻžāϝāĻŧāχ āĻ•āĻŋāϛ⧁ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āĻŦāĻž āϏāĻžāχāĻĄ-āĻāĻĢ⧇āĻ•ā§āϟ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰ⧇ (āĻ•āĻžāĻ°ā§āĻĄ āϚāĻžāĻ°ā§āϜ āĻ•āϰāĻž, āĻāĻ•āϟāĻŋ āĻŽā§‡āϏ⧇āϜ āĻĒāĻžāĻ āĻžāύ⧋, āĻāĻ•āϟāĻŋ āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ āĻļ⧁āϰ⧁ āĻ•āϰāĻž)āĨ¤ PATCH-āĻ“ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āĻĻāϰāĻ•āĻžāϰ āĻšāϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻĻāĻŋ āϤāĻž āϏāĻžāχāĻĄ-āĻāĻĢ⧇āĻ•ā§āϟ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰ⧇, āĻļ⧁āϧ⧁ āĻāĻ•āϟāĻŋ āĻĢāĻŋāĻ˛ā§āĻĄ āφāĻĒāĻĄā§‡āϟ āύāĻž āĻšāϝāĻŧāĨ¤ GET āĻ¸ā§āĻŸā§‡āϟ āĻŦāĻĻāϞāĻžāύ⧋ āωāϚāĻŋāϤ āύāϝāĻŧāĨ¤\n\n### āĻ¸ā§āϕ⧋āĻĒ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ: āϕ⧋āĻĨāĻžāϝāĻŧ āĻāĻ•āϟāĻŋ āϕ⧀ āχāωāύāĻŋāĻ•\n\nāφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāϏāĻžāϝāĻŧāĻŋāĻ• āύāĻŋāϝāĻŧāĻŽā§‡āϰ āϏāĻ™ā§āϗ⧇ āĻŽāĻŋāϞ āϰ⧇āϖ⧇ āĻāĻ•āϟāĻŋ āĻ¸ā§āϕ⧋āĻĒ āĻŦ⧇āϛ⧇ āύāĻŋāύāĨ¤ āϖ⧁āĻŦ āĻŦāĻŋāĻ¸ā§āϤ⧃āϤ āĻšāϞ⧇ āĻŦ⧈āϧ āĻ•āĻžāϜ āĻŦā§āϞāĻ• āĻšāĻŦ⧇; āϖ⧁āĻŦ āϏāĻ‚āϕ⧀āĻ°ā§āĻŖ āĻšāϞ⧇ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϘāϟāĻŦ⧇āĨ¤\n\nāϏāĻžāϧāĻžāϰāĻŖ āĻ¸ā§āϕ⧋āĻĒ:\n\n- per endpoint + customer\n- per endpoint + external object (āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, invoice_id āĻŦāĻž order_id)\n- per endpoint + tenant (āĻŽāĻžāĻ˛ā§āϟāĻŋ-āĻŸā§‡āĻ¨ā§āϝāĻžāĻ¨ā§āϏāĻŋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āϜāĻ¨ā§āϝ)\n- per endpoint + payment method + amount (āĻļ⧁āϧ⧁ āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻĒā§āϰ⧋āĻĄāĻžāĻ•ā§āϟ āύ⧀āϤāĻŋāϤ⧇ āϏ⧇āϟāĻž āĻ āĻŋāĻ• āĻĨāĻžāϕ⧇)\n\nāωāĻĻāĻžāĻšāϰāĻŖ: “Create payment” āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āϕ⧀āϕ⧇ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāϰ⧇āϰ āĻ•āĻžāϛ⧇ āχāωāύāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤ “Ingest webhook event” āĻāϰ āϜāĻ¨ā§āϝ, āϏ⧇āϟāĻŋāϕ⧇ payment provider-āĻāϰ āχāϭ⧇āĻ¨ā§āϟ ID (āĻĒā§āϰ⧋āĻ­āĻžāχāĻĄāĻžāϰ⧇āϰ āĻ—ā§āϞ⧋āĻŦāĻžāϞ āχāωāύāĻŋāĻ•) āĻ¸ā§āϕ⧋āĻĒ āĻ•āϰ⧁āύāĨ¤\n\n### āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āĻŸā§‡ āφāĻĒāύāĻŋ āϕ⧀ āĻĢ⧇āϰāϤ āĻĻ⧇āĻŦ⧇āύ āϤāĻž āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧁āύ\n\nāĻāĻ•āϟāĻŋ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āĻāϞ⧇ āĻĒā§āϰāĻĨāĻŽ āϏāĻĢāϞ āĻĒā§āϰāĻšā§‡āĻˇā§āϟāĻžāϰ āĻāĻ•āχ āφāωāϟāĻ•āĻžāĻŽ āĻĢ⧇āϰāϤ āĻĻāĻŋāύāĨ¤ āĻŦāĻžāĻ¸ā§āϤāĻŦ⧇ āĻāϰ āĻŽāĻžāύ⧇ āĻšāϞ⧋ āĻāĻ•āχ HTTP āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϕ⧋āĻĄ āĻāĻŦāĻ‚ āĻāĻ•āχ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻŦāĻĄāĻŋ (āĻ…āĻĨāĻŦāĻž āĻ…āĻ¨ā§āϤāϤ āĻāĻ•āχ resource ID āĻ“ state) āϰāĻŋāϞ⧇āĻĒ āĻ•āϰāĻžāĨ¤\n\nāĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāϰāĻž āĻāϰ āĻ“āĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇āĨ¤ āϝāĻĻāĻŋ āĻĒā§āϰāĻĨāĻŽ āĻšā§‡āĻˇā§āϟāĻž āϏāĻĢāϞ āĻšāϝāĻŧ āĻ•āĻŋāĻ¨ā§āϤ⧁ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻĒāĻĄāĻŧ⧇ āϝāĻžāϝāĻŧ, āϰāĻŋāĻŸā§āϰāĻžāχ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ āϚāĻžāĻ°ā§āϜ āĻŦāĻž āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ āϜāĻŦ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āωāϚāĻŋāϤ āύāϝāĻŧāĨ¤\n\n### āĻāĻ•āϟāĻŋ āϰāĻŋāĻŸā§‡āύāĻļāύ āωāχāĻ¨ā§āĻĄā§‹ āĻŦ⧇āϛ⧇ āύāĻŋāύ\n\nāϕ⧀āϗ⧁āϞ⧋ āĻŽā§‡āϝāĻŧāĻžāĻĻ āĻļ⧇āώ āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤāĨ¤ āϏ⧇āϗ⧁āϞ⧋ āĻĒāĻ°ā§āϝāĻžāĻĒā§āϤ āϏāĻŽāϝāĻŧ āϰāĻžāϖ⧁āύ āϝāĻžāϤ⧇ āĻŦāĻžāĻ¸ā§āϤāĻŦāϏāĻŽā§āĻŽāϤ āϰāĻŋāĻŸā§āϰāĻžāχ āĻāĻŦāĻ‚ āĻŦāĻŋāϞāĻŽā§āĻŦāĻŋāϤ āĻ•āĻžāϜ āĻ•āĻ­āĻžāϰ āĻšāϝāĻŧāĨ¤\n\n- Payments: 24 āĻĨ⧇āϕ⧇ 72 āϘāĻ¨ā§āϟāĻž āϏāĻžāϧāĻžāϰāĻŖ\n- Imports: āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āĻĒāϰ⧇ āφāĻŦāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āϤāĻžāχ āĻāĻ• āϏāĻĒā§āϤāĻžāĻš āϝ⧁āĻ•ā§āϤāĻŋāϝ⧁āĻ•ā§āϤ āĻšāϤ⧇ āĻĒāĻžāϰ⧇\n- Webhooks: āĻĒā§āϰ⧋āĻ­āĻžāχāĻĄāĻžāϰ⧇āϰ āϰāĻŋāĻŸā§āϰāĻžāχ āĻĒāϞāĻŋāϏāĻŋāϰ āϏāĻžāĻĨ⧇ āĻŽāĻŋāϞāĻžāύ\n\n### “āĻāĻ•āχ āĻ…āύ⧁āϰ⧋āĻ§â€ āϕ⧀āĻ­āĻžāĻŦ⧇ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰāĻŦ⧇āύ: āĻ¸ā§āĻĒāĻˇā§āϟ āϕ⧀ āĻŦāύāĻžāĻŽ āĻŦāĻĄāĻŋ āĻšā§āϝāĻžāĻļ\n\nāĻāĻ•āϟāĻŋ āĻ¸ā§āĻĒāĻˇā§āϟ idempotency key (āĻšā§‡āĻĄāĻžāϰ āĻŦāĻž āĻ•ā§āώ⧇āĻ¤ā§āϰ) āϏāĻžāϧāĻžāϰāĻŖāϤ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻĒāϰāĻŋāĻˇā§āĻ•āĻžāϰ āύāĻŋāϝāĻŧāĻŽāĨ¤\n\nāĻāĻ•āϟāĻŋ āĻŦāĻĄāĻŋ āĻšā§āϝāĻžāĻļ āĻŦā§āϝāĻžāĻ•āφāĻĒ āĻšāĻŋāϏ⧇āĻŦ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϤāĻž āϏāĻšāĻœā§‡āχ āĻ­āĻžāϙ⧇ āĻŽāĻžāϝāĻŧāĻžāĻŽāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āĻĢāϞ⧇ (āĻĢāĻŋāĻ˛ā§āĻĄ āĻ…āĻ°ā§āĻĄāĻžāϰ, āĻšā§‹āϝāĻŧāĻžāχāϟāĻ¸ā§āĻĒ⧇āϏ, āϟāĻžāχāĻŽāĻ¸ā§āĻŸā§āϝāĻžāĻŽā§āĻĒ)āĨ¤ āĻšā§āϝāĻžāĻļ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āχāύāĻĒ⧁āϟ āύāϰāĻŽāĻžāϞāĻžāχāϜ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϕ⧋āύ āĻĢāĻŋāĻ˛ā§āĻĄāϗ⧁āϞāĻŋāϕ⧇ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰāĻž āĻšāĻŦ⧇ āϤāĻž āĻ•āĻ ā§‹āϰāĻ­āĻžāĻŦ⧇ āĻ āĻŋāĻ• āϰāĻžāϖ⧁āύāĨ¤\n\n## āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āϕ⧀: āĻŦāĻžāĻ¸ā§āϤāĻŦ⧇ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇\n\nāĻāĻ•āϟāĻŋ idempotency key āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻāĻŦāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ āϏāĻšāϜ āϚ⧁āĻ•ā§āϤāĻŋ: “āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāχ āϕ⧀ āφāĻŦāĻžāϰ āĻĻ⧇āϖ⧇āύ, āĻāĻ•āχ āĻ…āύ⧁āϰ⧋āϧ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧁āύāĨ¤â€ retry-safe API-āĻāϰ āϜāĻ¨ā§āϝ āĻāϟāĻž āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāϝ⧋āĻ—ā§āϝ āϟ⧁āϞāϗ⧁āϞ⧋āϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋāĨ¤\n\nāϕ⧀ āĻĻā§â€™āĻĒāĻ•ā§āώ āĻĨ⧇āϕ⧇āχ āφāϏāϤ⧇ āĻĒāĻžāϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ…āϧāĻŋāĻ•āĻžāĻ‚āĻļ API-āϰ āϜāĻ¨ā§āϝ āĻāϟāĻŋ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ-āĻœā§‡āύāĻžāϰ⧇āĻŸā§‡āĻĄ āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤāĨ¤ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāχ āϜāĻžāύ⧇ āĻ•āĻ–āύ āĻāϟāĻŋ āĻāĻ•āχ āĻ…ā§āϝāĻžāĻ•āĻļāύ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāϛ⧇, āϤāĻžāχ āĻāϟāĻŋ āĻāĻ•āχ āϕ⧀ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϏāĻžāĻ°ā§āĻ­āĻžāϰ-āĻœā§‡āύāĻžāϰ⧇āϟ āϕ⧀ āϤāĻ–āύāχ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰ⧇ āϝāĻ–āύ āφāĻĒāύāĻŋ āĻĒā§āϰāĻĨāĻŽā§‡ āĻāĻ•āϟāĻŋ "āĻĄā§āϰāĻžāĻĢāϟ" āϰāĻŋāϏ⧋āĻ°ā§āϏ (āωāĻĻāĻžāĻšāϰāĻŖ: āĻāĻ•āϟāĻŋ āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ āϜāĻŦ) āϤ⧈āϰāĻŋ āĻ•āϰ⧇āύ āĻāĻŦāĻ‚ āĻĒāϰ⧇ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāĻĻ⧇āϰ āϏ⧇āχ āϜāĻŦ āφāχāĻĄāĻŋ āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āĻ•āϰ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāϤ⧇ āĻĻ⧇āύ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏ⧇āϗ⧁āϞ⧋ āĻĒā§āϰāĻĨāĻŽ āĻ…āύ⧁āϰ⧋āϧ⧇ āϏāĻšāĻžāϝāĻŧāĻ• āύāϝāĻŧāĨ¤\n\nāĻ°ā§āϝāĻžāĻ¨ā§āĻĄāĻŽ, āĻ…āύ⧁āĻŽāĻžāύāϝ⧋āĻ—ā§āϝ āύāϝāĻŧ āĻāĻŽāύ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āĻ•āĻŽāĻĒāĻ•ā§āώ⧇ 128 āĻŦāĻŋāϟ āĻ°â€ā§āϝāĻžāĻ¨ā§āĻĄāĻŽāύ⧇āϏ āϞāĻ•ā§āĻˇā§āϝ āĻ•āϰ⧁āύ (āωāĻĻāĻžāĻšāϰāĻŖ: 32 hex āĻ…āĻ•ā§āώāϰ āĻŦāĻž āĻāĻ•āϟāĻŋ UUID)āĨ¤ āϟāĻžāχāĻŽāĻ¸ā§āĻŸā§āϝāĻžāĻŽā§āĻĒ āĻŦāĻž user IDs āĻĨ⧇āϕ⧇ āϕ⧀ āĻŦāĻžāύāĻžāĻŦ⧇āύ āύāĻžāĨ¤\n\nāϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇, āϕ⧀āϟāĻŋ āĻāĻŽāύ āĻĒā§āϰāϏāĻ™ā§āϗ⧇āϰ āϏāĻžāĻĨ⧇ āĻ¸ā§āĻŸā§‹āϰ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āϕ⧁āĻĄāĻŧāĻžāύ⧋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ“ āĻŽā§‚āϞ āĻĢāϞāĻžāĻĢāϞ āϰāĻŋāϞ⧇āĻĒ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϝāĻĨ⧇āĻˇā§āϟ āϤāĻĨā§āϝ āĻĨāĻžāϕ⧇:\n\n- āϝ⧇ āĻ•āϞ āĻ•āϰ⧇āϛ⧇ (account āĻŦāĻž user ID)\n- āϕ⧋āύ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻŦāĻž āĻ…āĻĒāĻžāϰ⧇āĻļāύ⧇āϰ āϜāĻ¨ā§āϝ āĻāϟāĻŋ āĻĒā§āϰāϝ⧋āĻœā§āϝ\n- āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ…āύ⧁āϰ⧋āϧ āĻĢāĻŋāĻ˛ā§āĻĄāϗ⧁āϞ⧋āϰ āĻāĻ•āϟāĻŋ āĻšā§āϝāĻžāĻļ\n- āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ (in-progress, succeeded, failed)\n- āϰāĻŋāϞ⧇āĻĒ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϰ⧇āϏāĻĒāĻ¨ā§āϏ (āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϕ⧋āĻĄ āĻ“ āĻŦāĻĄāĻŋ)\n\nāĻāĻ•āϟāĻŋ āϕ⧀ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻ¸ā§āϕ⧋āĻĒāĻĄ āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤ, āϏāĻžāϧāĻžāϰāĻŖāϤ user (āĻ…āĻĨāĻŦāĻž API token) āĻĒā§āϞāĻžāϏ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟāĨ¤ āϝāĻĻāĻŋ āĻāĻ•āχ āϕ⧀ āĻ­āĻŋāĻ¨ā§āύ āĻĒ⧇-āϞ⧋āĻĄ āύāĻŋāϝāĻŧ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒāĻžāĻ āĻžāύ⧋ āĻšāϝāĻŧ, āĻ¸ā§āĻĒāĻˇā§āϟ āĻāĻ•āϟāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āĻĻāĻŋāύāĨ¤ āĻāϟāĻŋ āĻĻ⧁āĻ°ā§āϘāϟāύāĻžāϜāύāĻŋāϤ āϕ⧋āϞāĻŋāĻļāύ āĻĒā§āϰāϤāĻŋāϰ⧋āϧ āĻ•āϰ⧇ āϝ⧇āĻ–āĻžāύ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻžāĻ—āĻŋ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻĒ⧁āϰāύ⧋ āϕ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āύāϤ⧁āύ āĻĒ⧇āĻŽā§‡āĻ¨ā§āϟ āĻ…ā§āϝāĻžāĻŽāĻžāωāĻ¨ā§āϟ āĻĒāĻžāĻ āĻžāϝāĻŧāĨ¤\n\nāϰāĻŋāϞ⧇āĻĒ⧇, āĻĒā§āϰāĻĨāĻŽ āϏāĻĢāϞ āĻĒā§āϰāĻšā§‡āĻˇā§āϟāĻžāϰ āĻāĻ•āχ āĻĢāϞāĻžāĻĢāϞ āĻĢ⧇āϰāϤ āĻĻāĻŋāύ — āĻāĻ•āχ HTTP āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϕ⧋āĻĄ āĻāĻŦāĻ‚ āĻāĻ•āχ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻŦāĻĄāĻŋ, āĻ•āĻžāρāϚāĻž āϰāĻŋāĻĄ āύāĻž āϝ⧇āϟāĻž āϏāĻŽāϝāĻŧ⧇āϰ āϏāĻžāĻĨ⧇ āĻŦāĻĻāϞāĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤\n\n## PostgreSQL-āĻ āĻĄā§‡āĻĄā§āĻĒ āĻŸā§‡āĻŦāĻŋāϞ: āĻāĻ•āϟāĻŋ āϏāϰāϞ, āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ\n\nāĻāĻ•āϟāĻŋ āύāĻŋāĻŦ⧇āĻĻāĻŋāϤ deduplication āĻŸā§‡āĻŦāĻŋāϞ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇āϰ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϏāĻšāϜ āωāĻĒāĻžāϝāĻŧāϗ⧁āϞ⧋āϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋāĨ¤ āĻĒā§āϰāĻĨāĻŽ āĻ…āύ⧁āϰ⧋āϧ idempotency āϕ⧀-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āϰ⧋ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϰāĻŋāĻŸā§āϰāĻžāχ āϏ⧇āχ āĻāĻ•āχ āϰ⧋ āĻĒāĻĄāĻŧ⧇ āĻāĻŦāĻ‚ āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻĢāϞāĻžāĻĢāϞ āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧāĨ¤\n\n### āϕ⧀ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻŦ⧇āύ\n\nāĻŸā§‡āĻŦāĻŋāϞāϟāĻŋ āϛ⧋āϟ āĻ“ āĻĢā§‹āĻ•āĻžāϏāĻĄ āϰāĻžāϖ⧁āύāĨ¤ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻ•āĻžāĻ āĻžāĻŽā§‹:\n\n- key: idempotency key (text)\n- owner: āϝ⧇ āϕ⧀āϟāĻŋāϰ āĻŽāĻžāϞāĻŋāĻ• (user_id, account_id, āĻŦāĻž API client ID)\n- request_hash: āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ…āύ⧁āϰ⧋āϧ āĻ•ā§āώ⧇āĻ¤ā§āϰāϗ⧁āϞ⧋āϰ āĻāĻ•āϟāĻŋ āĻšā§āϝāĻžāĻļ\n- response: āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻĒ⧇-āϞ⧋āĻĄ (āĻĒā§āϰāĻžāϝāĻŧāĻļāχ JSON) āĻ…āĻĨāĻŦāĻž āĻ¸ā§āĻŸā§‹āϰ āĻ•āϰāĻž āĻĢāϞāĻžāĻĢāϞ⧇āϰ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟāĻžāϰ\n- created_at: āĻ•āĻ–āύ āϕ⧀ āĻĒā§āϰāĻĨāĻŽ āĻĻ⧇āĻ–āĻž āϗ⧇āϛ⧇\n\nāχāωāύāĻŋāĻ• āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāĻ¨ā§āϟāχ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ⧇āϰ āϕ⧋āϰāĨ¤ (owner, key)-āĻ āχāωāύāĻŋāĻ•āĻ¨ā§āϏ ENFORCE āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āĻāĻ• āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϤ⧈āϰāĻŋ āύāĻž āĻ•āϰ⧇, āĻāĻŦāĻ‚ āĻĻ⧁āχāϟāĻŋ āĻ­āĻŋāĻ¨ā§āύ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āϕ⧋āϞāĻžāχāĻĄ āύāĻž āĻ•āϰ⧇āĨ¤\n\nrequest_hash-āĻ“ āϰāĻžāϖ⧁āύ āϝāĻžāϤ⧇ āϕ⧀ āĻŽāĻŋāϏāχāωāϏ āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰ⧇āύāĨ¤ āϝāĻĻāĻŋ āĻĒ⧁āύāϰāĻžāϝāĻŧ āφāϏāĻž āĻāĻ•āχ āϕ⧀ āύāĻŋāϝāĻŧ⧇ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ­āĻŋāĻ¨ā§āύ āĻšā§āϝāĻžāĻļ āĻĨāĻžāϕ⧇, āϤāĻžāϤ⧇ āĻāĻ•āϟāĻŋ āĻ¤ā§āϰ⧁āϟāĻŋ āĻĢ⧇āϰāϤ āĻĻāĻŋāύ āϝāĻžāϤ⧇ āĻĻ⧁āχ āĻ­āĻŋāĻ¨ā§āύ āĻ…āĻĒāĻžāϰ⧇āĻļāύ āĻāĻ• āϕ⧀āϰ āĻŽāĻ§ā§āϝ⧇ āĻŽāĻŋāĻļ⧇ āύāĻž āϝāĻžāϝāĻŧāĨ¤\n\n### āϰāĻŋāĻŸā§‡āύāĻļāύ āĻāĻŦāĻ‚ āχāύāĻĄā§‡āĻ•ā§āϏāĻŋāĻ‚\n\nDedup āϰ⧋ āĻ…āύāĻ¨ā§āϤāĻ•āĻžāϞ⧇āϰ āϜāĻ¨ā§āϝ āĻĨāĻžāĻ•āĻž āωāϚāĻŋāϤ āύāϝāĻŧāĨ¤ āĻŦāĻžāĻ¸ā§āϤāĻŦ āϰāĻŋāĻŸā§āϰāĻžāχ āωāχāĻ¨ā§āĻĄā§‹ āĻĒāĻ°ā§āϝāĻžāĻĒā§āϤ āϏāĻŽāϝāĻŧ āϰāĻžāϖ⧁āύ, āϤāĻžāϰāĻĒāϰ āϏ⧇āϗ⧁āϞ⧋ āĻ•ā§āϞāĻŋāύāφāĻĒ āĻ•āϰ⧁āύāĨ¤\n\nāϞ⧋āĻĄā§‡āϰ āύāĻŋāĻšā§‡ āĻĻā§āϰ⧁āϤāϤāĻžāϰ āϜāĻ¨ā§āϝ:\n\n- āĻĻā§āϰ⧁āϤ insert āĻŦāĻž lookup-āĻāϰ āϜāĻ¨ā§āϝ (owner, key)-āĻ āχāωāύāĻŋāĻ• āχāύāĻĄā§‡āĻ•ā§āϏ\n- āĻ•ā§āϞāĻŋāύāφāĻĒ āϏāĻ¸ā§āϤāĻž āĻ•āϰāϤ⧇ created_at-āĻ āϐāĻšā§āĻ›āĻŋāĻ• āχāύāĻĄā§‡āĻ•ā§āϏ\n\nāϝāĻĻāĻŋ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻŦāĻĄāĻŧ āĻšāϝāĻŧ, āĻāĻ•āϟāĻŋ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟāĻžāϰ (āωāĻĻāĻžāĻšāϰāĻŖ: result ID) āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻĒā§‚āĻ°ā§āĻŖ āĻĒ⧇-āϞ⧋āĻĄ āĻ…āĻ¨ā§āϝāĻ¤ā§āϰ āϰāĻžāϖ⧁āύāĨ¤ āĻāϤ⧇ āĻŸā§‡āĻŦāĻŋāϞ āĻŦ⧇āϞ⧋āϝāĻŧāĻŋāĻ‚ āĻ•āĻŽā§‡ āĻāĻŦāĻ‚ retry āφāϚāϰāĻŖ āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻ• āĻĨāĻžāϕ⧇āĨ¤\n\n## āϧāĻžāĻĒ⧇ āϧāĻžāĻĒ⧇: Go-āϤ⧇ āĻāĻ•āϟāĻŋ retry-safe āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ āĻĢā§āϞ⧋\n\nāĻāĻ•āϟāĻŋ retry-safe āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ⧇āϰ āĻĻ⧁āϟāĻŋ āϜāĻŋāύāĻŋāϏ āϞāĻžāϗ⧇: “āĻāĻ•āχ āĻ…āύ⧁āϰ⧋āϧ āφāĻŦāĻžāĻ°â€ āĻļāύāĻžāĻ•ā§āϤ āĻ•āϰāĻžāϰ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĨāĻŋāϤāĻŋāĻļā§€āϞ āωāĻĒāĻžāϝāĻŧ, āĻāĻŦāĻ‚ āĻĒā§āϰāĻĨāĻŽ āφāωāϟāĻ•āĻžāĻŽ āϟāĻŋāϕ⧇ āĻŸā§‡āĻ•āϏāχāĻ­āĻžāĻŦ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻžāϰ āϜāĻžāϝāĻŧāĻ—āĻž āϝāĻžāϤ⧇ āφāĻĒāύāĻŋ āϤāĻž āϰāĻŋāϞ⧇āĻĒ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤\n\nāĻĒ⧇āĻŽā§‡āĻ¨ā§āϟ, āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ āĻāĻŦāĻ‚ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āχāύāĻœā§‡āĻļāύ-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ• āĻĢā§āϞ⧋:\n\n1) āĻ…āύ⧁āϰ⧋āϧ āĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āϟ āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ āϤāĻŋāύāϟāĻŋ āĻŽāĻžāύ āĻ…āĻŦāϤāĻžāϰāĻŖāĻž āĻ•āϰ⧁āύ: āĻāĻ•āϟāĻŋ idempotency key (āĻšā§‡āĻĄāĻžāϰ āĻŦāĻž āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻ•ā§āώ⧇āĻ¤ā§āϰ āĻĨ⧇āϕ⧇), āĻāĻ•āϟāĻŋ owner (tenant āĻŦāĻž user ID), āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ request hash (āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻĢāĻŋāĻ˛ā§āĻĄāϗ⧁āϞ⧋āϰ āĻšā§āϝāĻžāĻļ)āĨ¤\n\n2) āĻāĻ•āϟāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āĻŸā§āϰāĻžāĻ¨ā§āϏāĻ…ā§āϝāĻžāĻ•āĻļāύ āĻļ⧁āϰ⧁ āĻ•āϰ⧇ dedup āϰ⧇āĻ•āĻ°ā§āĻĄ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧁āύāĨ¤ āĻāϟāĻŋāϕ⧇ (owner, key)-āĻ āχāωāύāĻŋāĻ• āĻ•āϰ⧁āύāĨ¤ request_hash, āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ (started, completed) āĻāĻŦāĻ‚ āϰ⧇āϏāĻĒāĻ¨ā§āϏ⧇āϰ āĻĒā§āϞ⧇āϏāĻšā§‹āĻ˛ā§āĻĄāĻžāϰ āĻ¸ā§āĻŸā§‹āϰ āĻ•āϰ⧁āύāĨ¤\n\n3) āϝāĻĻāĻŋ insert āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟ āĻ•āϰ⧇, āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āϰ⧋ āϞ⧋āĻĄ āĻ•āϰ⧁āύāĨ¤ āϝāĻĻāĻŋ āϏ⧇āϟāĻž completed āĻšāϝāĻŧ, āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻĢ⧇āϰāϤ āĻĻāĻŋāύāĨ¤ āϝāĻĻāĻŋ āĻāϟāĻž started āĻšāϝāĻŧ, āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇ āĻ…āĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰ⧁āύ (āϏāĻŋāĻŽā§āĻĒāϞ āĻĒā§‹āϞāĻŋāĻ‚) āĻ…āĻĨāĻŦāĻž 409/202 āĻĢ⧇āϰāϤ āĻĻāĻŋāύ āϝāĻžāϤ⧇ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻĒāϰ⧇ āφāĻŦāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧇āĨ¤\n\n4) āϕ⧇āĻŦāϞ āϤāĻ–āύāχ āϝāĻ–āύ āφāĻĒāύāĻŋ āϏāĻĢāϞāĻ­āĻžāĻŦ⧇ dedup āϰ⧋ “own” āĻ•āϰ⧇āύ, āĻŦāĻŋāϜāύ⧇āϏ āϞāϜāĻŋāĻ• āĻāĻ•āĻŦāĻžāϰ āϚāĻžāϞāĻžāύāĨ¤ āϏāĻŽā§āĻ­āĻŦ āĻšāϞ⧇ āĻāĻ•āχ āĻŸā§āϰāĻžāĻ¨ā§āϏāĻ…ā§āϝāĻžāĻ•āĻļāύ⧇āϰ āĻ­āĻŋāϤāϰ⧇āχ āϏāĻžāχāĻĄ-āĻāĻĢ⧇āĻ•ā§āϟ āϞāĻŋāϖ⧁āύāĨ¤ āĻŦāĻŋāϜāύ⧇āϏ āϰ⧇āϜāĻžāĻ˛ā§āϟ āĻāĻŦāĻ‚ HTTP āϰ⧇āϏāĻĒāĻ¨ā§āϏ (āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϕ⧋āĻĄ āĻ“ āĻŦāĻĄāĻŋ) āĻ¸ā§āĻĨāĻžāϝāĻŧā§€ āĻ•āϰ⧁āύāĨ¤\n\n5) āĻ•āĻŽāĻŋāϟ āĻ•āϰ⧁āύ, āĻāĻŦāĻ‚ idempotency key āĻ“ owner āĻĻāĻŋāϝāĻŧ⧇ āϞāĻ— āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āĻŸā§āϰ⧇āϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤\n\nāĻāĻ•āϟāĻŋ āĻŽāĻŋāύāĻŋ āĻŽāĻžāϞ āĻŸā§‡āĻŦāĻŋāϞ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ:\n\nsql\ncreate table idempotency_keys (\n owner_id text not null,\n idem_key text not null,\n request_hash text not null,\n status text not null,\n response_code int,\n response_body jsonb,\n created_at timestamptz not null default now(),\n updated_at timestamptz not null default now(),\n primary key (owner_id, idem_key)\n);\n\n\nāωāĻĻāĻžāĻšāϰāĻŖ: āĻāĻ•āϟāĻŋ “Create payout” āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āϚāĻžāĻ°ā§āϜ āĻ•āϰ⧇ āϟāĻžāχāĻŽāφāωāϟ āĻĒāĻžāϝāĻŧāĨ¤ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻāĻ•āχ āϕ⧀ āύāĻŋāϝāĻŧ⧇ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰ⧇āĨ¤ āφāĻĒāύāĻžāϰ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟ āĻĻ⧇āϖ⧇ completed āϰ⧇āĻ•āĻ°ā§āĻĄ āĻĻ⧇āĻ–āĻŦ⧇ āĻāĻŦāĻ‚ āĻŽā§‚āϞ payout ID āĻĢ⧇āϰāϤ āĻĻ⧇āĻŦ⧇, āφāĻŦāĻžāϰ āϚāĻžāĻ°ā§āϜ āĻ•āϰāĻŦ⧇ āύāĻžāĨ¤\n\n## āĻĒ⧇āĻŽā§‡āĻ¨ā§āϟ: āϟāĻžāχāĻŽāφāωāĻŸā§‡āϰ āĻĒāϰāĻ“ āĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻāĻ•āĻŦāĻžāϰāχ āϚāĻžāĻ°ā§āϜ āĻ•āϰāĻž\n\nāĻĒ⧇āĻŽā§‡āĻ¨ā§āϟ āĻšāϞ āϏ⧇āχ āϜāĻžāϝāĻŧāĻ—āĻž āϝ⧇āĻ–āĻžāύ⧇ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āĻ…āĻĒāĻļāύāĻžāϞ āύāϝāĻŧāĨ¤ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧ, āĻŽā§‹āĻŦāĻžāχāϞ āĻ…ā§āϝāĻžāĻĒ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰ⧇, āĻāĻŦāĻ‚ āϗ⧇āϟāĻ“āϝāĻŧ⧇ āĻŽāĻžāĻā§‡ āĻŽāĻžāĻā§‡ āϟāĻžāχāĻŽāφāωāϟ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ āϝāĻĻāĻŋāĻ“ āϤāĻžāϰāĻž āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āϚāĻžāĻ°ā§āϜ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āϛ⧇āĨ¤\n\nāĻāĻ•āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ• āύāĻŋāϝāĻŧāĻŽ: idempotency key āϚāĻžāĻ°ā§āϜ āϤ⧈āϰāĻŋāϕ⧇ āϰāĻ•ā§āώ āĻ•āϰ⧇, āĻāĻŦāĻ‚ payment provider ID (charge/intent ID) āĻĒāϰ⧇ āϏāĻ¤ā§āϝ⧇āϰ āĻ‰ā§ŽāϏ āĻšāϝāĻŧ⧇ āĻ“āϠ⧇āĨ¤ āĻāĻ•āĻŦāĻžāϰ āφāĻĒāύāĻŋ provider ID āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇ āύāĻŋāϞ⧇ āĻāĻ•āχ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϜāĻ¨ā§āϝ āύāϤ⧁āύ āϚāĻžāĻ°ā§āϜ āĻ•āϰāĻŦ⧇āύ āύāĻžāĨ¤\n\nāĻāĻ•āϟāĻŋ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ āϝāĻž āϰāĻŋāĻŸā§āϰāĻžāχ āĻāĻŦāĻ‚ āϗ⧇āϟāĻ“āϝāĻŧ⧇ āĻ…āύāĻŋāĻļā§āϚāϝāĻŧāϤāĻž āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞ āĻ•āϰ⧇:\n\n- idempotency key āĻĒāĻĄāĻŧ⧁āύ āĻ“ āĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āϟ āĻ•āϰ⧁āύāĨ¤\n- āĻāĻ•āϟāĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āĻŸā§āϰāĻžāĻ¨ā§āϏāĻ…ā§āϝāĻžāĻ•āĻļāύ⧇ (merchant_id, idempotency_key) āĻĻā§āĻŦāĻžāϰāĻž āϕ⧀-āĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āĻāĻ•āϟāĻŋ payment āϰ⧋ āϤ⧈āϰāĻŋ āĻŦāĻž āϰāĻŋāĻĢ⧇āϚ āĻ•āϰ⧁āύāĨ¤ āϝāĻĻāĻŋ āĻāϤ⧇ provider_id āĻĨāĻžāϕ⧇, āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āϰ⧇āϜāĻžāĻ˛ā§āϟ āĻĢ⧇āϰāϤ āĻĻāĻŋāύāĨ¤\n- āϝāĻĻāĻŋ provider_id āύāĻž āĻĨāĻžāϕ⧇, āϗ⧇āϟāĻ“āϝāĻŧ⧇āϤ⧇ PaymentIntent/Charge āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻ•āϞ āĻ•āϰ⧁āύāĨ¤\n- āϗ⧇āϟāĻ“āϝāĻŧ⧇ āϏāĻĢāϞ āĻšāϞ⧇ provider_id āĻ¸ā§āĻĨāĻžāϝāĻŧā§€ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ payment āϕ⧇ “succeeded” (āĻ…āĻĨāĻŦāĻž “requires_action”) āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŽāĻžāĻ°ā§āĻ• āĻ•āϰ⧁āύāĨ¤\n- āϝāĻĻāĻŋ āϗ⧇āϟāĻ“āϝāĻŧ⧇ āϟāĻžāχāĻŽāφāωāϟ āĻĻ⧇āϝāĻŧ āĻŦāĻž āĻ…āϜāĻžāύāĻž āϰ⧇āϜāĻžāĻ˛ā§āϟ āĻĻ⧇āϝāĻŧ, āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ “pending” āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāϕ⧇ āĻāĻ•āϟāĻŋ āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻ• āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻĻāĻŋāύ āϝāĻžāϤ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāĻž āύāĻŋāϰāĻžāĻĒāĻĻāĨ¤\n\nāϟāĻžāχāĻŽāφāωāϟ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻŸā§āϰāĻŋāϟ āĻ•āϰāĻŦ⧇āύ āϤāĻž āĻšāϞ āĻŽā§‚āϞ āĻŦāĻŋāώāϝāĻŧ: āĻĢ⧇āϞ āϧāϰāĻŦ⧇āύ āύāĻžāĨ¤ payment āϕ⧇ pending āĻšāĻŋāϏ⧇āĻŦ⧇ āϚāĻŋāĻšā§āύāĻŋāϤ āĻ•āϰ⧁āύ, āĻĒāϰ⧇ āϗ⧇āϟāĻ“āϝāĻŧ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āύāĻĢāĻžāĻ°ā§āĻŽ āĻ•āϰ⧁āύ (āĻ…āĻĨāĻŦāĻž webhook āĻŽāĻžāϰāĻĢāϤ) āϝāĻ–āύ āφāĻĒāύāĻžāϰ āĻ•āĻžāϛ⧇ provider ID āĻĨāĻžāϕ⧇āĨ¤\n\nāĻāϰāϰ āϰ⧇āϏāĻĒāĻ¨ā§āϏāϗ⧁āϞ⧋ āĻĒā§‚āĻ°ā§āĻŦāĻžāύ⧁āĻŽāĻžāύāϝ⧋āĻ—ā§āϝ āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤāĨ¤ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāϰāĻž āφāĻĒāύāĻŋ āϝāĻž āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ•āϰāĻŦ⧇āύ āϏ⧇āϟāĻžāϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āϰāĻŋāĻŸā§āϰāĻžāχ āϞāϜāĻŋāĻ• āĻŦāĻžāύāĻžāϝāĻŧ, āϤāĻžāχ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϕ⧋āĻĄ āĻ“ āĻāϰāϰ āĻļ⧇āĻĒ āĻ¸ā§āĻĨāĻŋāϰ āϰāĻžāϖ⧁āύāĨ¤\n\n## āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ āĻāĻŦāĻ‚ āĻŦā§āϝāĻžāϚ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ: āĻ…āĻ—ā§āϰāĻ—āϤāĻŋ āĻšāĻžāϰāĻžāύ⧋ āĻ›āĻžāĻĄāĻŧāĻžāχ āĻĄā§‡āĻĄāĻžāĻĒ\n\nāχāĻŽā§āĻĒā§‹āĻ°ā§āĻŸā§‡āχ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻŦ⧇āĻļāĻŋ āĻ•ā§āώāϤāĻŋ āĻ•āϰ⧇āĨ¤ āĻāĻ•āϜāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ CSV āφāĻĒāϞ⧋āĻĄ āĻ•āϰ⧇, āφāĻĒāύāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ 95% āĻ āϟāĻžāχāĻŽāφāωāϟ āĻ•āϰ⧇, āĻāĻŦāĻ‚ āϤāĻžāϰāĻž āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰāϞ⧇ āĻ•āĻŋ āĻšāĻŦ⧇? āĻĒāϰāĻŋāĻ•āĻ˛ā§āĻĒāύāĻž āύāĻž āĻĨāĻžāĻ•āϞ⧇ āφāĻĒāύāĻŋ āĻšāϝāĻŧ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϏāĻžāϰāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻŦ⧇āύ āĻ…āĻĨāĻŦāĻž āϤāĻžāĻĻ⧇āϰ āφāĻŦāĻžāϰ āĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇ āĻŦāϞāĻŦ⧇āύāĨ¤\n\nāĻŦā§āϝāĻžāϚ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻĻ⧁āχ āĻ¸ā§āϤāϰ⧇āϰ āĻ•āĻĨāĻž āĻ­āĻžāĻŦ⧁āύ: āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ āϜāĻŦ āĻāĻŦāĻ‚ āϤāĻžāϰ āĻ­āĻŋāϤāϰ⧇āϰ āφāχāĻŸā§‡āĻŽāϗ⧁āϞ⧋āĨ¤ āϜāĻŦ-āϞ⧇āϭ⧇āϞ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āĻāĻ•āχ āĻ…āύ⧁āϰ⧋āϧ āĻĨ⧇āϕ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āϜāĻŦ āϤ⧈āϰāĻŋ āĻšāĻ“āϝāĻŧāĻž āĻŦāĻ¨ā§āϧ āĻ•āϰ⧇āĨ¤ āφāχāĻŸā§‡āĻŽ-āϞ⧇āϭ⧇āϞ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āĻāĻ•āχ āϏāĻžāϰāĻŋ āĻĻ⧁āχāĻŦāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻšāĻ“āϝāĻŧāĻž āϰ⧋āϧ āĻ•āϰ⧇āĨ¤\n\nāϜāĻŦ-āϞ⧇āϭ⧇āϞ⧇āϰ āĻĒā§āϝāĻžāϟāĻžāĻ°ā§āύ āĻšāϞ⧋ āĻĒā§āϰāĻ¤ā§āϝ⧇āĻ• āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ āϰāĻŋāϕ⧁āϝāĻŧ⧇āĻ¸ā§āĻŸā§‡ āĻāĻ•āϟāĻŋ idempotency key āĻĒā§āϰāϝāĻŧā§‹āϜāύ (āĻ…āĻĨāĻŦāĻž āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĨāĻŋāϤāĻŋāĻļā§€āϞ request hash + user ID āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋāϕ⧇ āĻĄā§‡āϰāĻžāχāĻ­ āĻ•āϰāĻž)āĨ¤ āĻāϟāĻŋāϕ⧇ import_job āϰ⧇āĻ•āĻ°ā§āĻĄā§‡āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϰāĻŋāĻŸā§āϰāĻžāχ āĻšāϞ⧇ āĻāĻ•āχ job ID āĻĢ⧇āϰāϤ āĻĻāĻŋāύāĨ¤ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ āĻŦāϞāĻž āωāϚāĻŋāϤ, “āφāĻŽāĻŋ āĻāχ āϜāĻŦāϟāĻŋ āĻĻ⧇āϖ⧇āĻ›āĻŋ, āĻāϟāĻžāχ āĻāϰ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āĻ¸ā§āĻŸā§‡āϟ,” āĻŦāϞāĻžāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ “āφāĻŦāĻžāϰ āĻļ⧁āϰ⧁ āĻ•āϰ⧁āύāĨ¤â€\n\nāφāχāĻŸā§‡āĻŽ-āϞ⧇āϭ⧇āϞ āĻĄā§‡āĻĄāĻžāĻĒ⧇, āĻĄā§‡āϟāĻžāϤ⧇ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āĻĨāĻžāĻ•āĻž āĻāĻ•āϟāĻŋ āĻ¨ā§āϝāĻžāϚāĻžāϰāĻžāϞ āϕ⧀-āϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧁āύāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻžāϰāĻŋāϤ⧇ āϏ⧋āĻ°ā§āϏ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āĻāĻ•āϟāĻŋ external_id āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇, āĻŦāĻž āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĨāĻŋāϤāĻŋāĻļā§€āϞ āĻ•āĻŽā§āĻŦā§‹ āϝ⧇āĻŽāύ (account_id, email)āĨ¤ PostgreSQL-āĻ āχāωāύāĻŋāĻ• āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāĻ¨ā§āϟ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ upsert āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āϰāĻŋāĻŸā§āϰāĻžāχāϗ⧁āϞ⧋ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϤ⧈āϰāĻŋ āύāĻž āĻ•āϰ⧇āĨ¤\n\nāĻļāĻŋāĻĒ āĻ•āϰāĻžāϰ āφāϗ⧇ āϏāĻŋāĻĻā§āϧāĻžāĻ¨ā§āϤ āύāĻŋāύ āĻāĻ•āϟāĻŋ āϰāĻŋāϞ⧇āĻĒ āĻ•āĻŋ āĻ•āϰ⧇ āϝāĻ–āύ āĻāĻ•āϟāĻŋ āϏāĻžāϰāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āφāϛ⧇āĨ¤ āĻ¸ā§āĻĒāĻˇā§āϟ āϰāĻžāϖ⧁āύ: āĻ¸ā§āĻ•āĻŋāĻĒ āĻ•āϰāĻŦ⧇āύ, āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĢāĻŋāĻ˛ā§āĻĄ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻŦ⧇āύ, āĻŦāĻž āĻĢ⧇āϞ āĻ•āϰāĻŦ⧇āύāĨ¤ āĻ¸ā§āĻĒāĻˇā§āϟ āύāĻŋāϝāĻŧāĻŽ āύāĻž āĻĨāĻžāĻ•āϞ⧇ “merge” āĻāĻĄāĻŧāĻŋāϝāĻŧ⧇ āϚāϞ⧁āύāĨ¤\n\nāφāĻ‚āĻļāĻŋāĻ• āϏāĻžāĻĢāĻ˛ā§āϝ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•āĨ¤ āϏāĻŦāĻ•āĻŋāϛ⧁ “ok” āĻŦāĻž “failed” āύāĻž āĻ•āϰ⧇, āϜāĻŦ-āϞ⧇āϭ⧇āϞ⧇ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻžāϰāĻŋāϰ āφāωāϟāĻ•āĻžāĻŽ āĻ¸ā§āĻŸā§‹āϰ āĻ•āϰ⧁āύ: row number, natural key, status (created, updated, skipped, error), āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻāϰāϰ āĻŽā§‡āϏ⧇āϜāĨ¤ āϰāĻŋāĻŸā§āϰāĻžāχ āĻšāϞ⧇ āφāĻĒāύāĻŋ āύāĻŋāϰāĻžāĻĒāĻĻ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞāĻžāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύ āĻāĻŦāĻ‚ āϝ⧇āϏāĻŦ āϏāĻžāϰāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āĻļ⧇āώ āĻšāϝāĻŧ⧇āϛ⧇ āϤāĻžāĻĻ⧇āϰ āĻāĻ•āχ āĻĢāϞāĻžāĻĢāϞ āϰāĻžāĻ–āĻŦ⧇āύāĨ¤\n\nāχāĻŽā§āĻĒā§‹āĻ°ā§āϟāϗ⧁āϞāĻŋ restartable āĻ•āϰāϤ⧇, āĻšā§‡āĻ•āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āϝ⧋āĻ— āĻ•āϰ⧁āύāĨ¤ āĻĒ⧇āĻœā§‡ āĻĒā§āϰāϏ⧇āϏ āĻ•āϰ⧁āύ (āωāĻĻāĻžāĻšāϰāĻŖ: āĻĒā§āϰāϤāĻŋ āĻĒ⧇āϜ 500 āϏāĻžāϰāĻŋ), āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒ⧇āϜ āĻ•āĻŽāĻŋāϟ āĻ•āϰāĻžāϰ āĻĒāϰ⧇ āĻļ⧇āώ āĻĒā§āϰāϏ⧇āϏ āĻšāĻ“āϝāĻŧāĻž āĻ•āĻžāĻ°ā§āϏāϰ (row index āĻŦāĻž source cursor) āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύāĨ¤ āĻĒā§āϰāϏ⧇āϏ āĻ•ā§āĻ°ā§āϝāĻžāĻļ āĻ•āϰāϞ⧇ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻšā§‡āĻˇā§āϟāĻž āĻļ⧇āώ āĻšā§‡āĻ•āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻĨ⧇āϕ⧇ āĻļ⧁āϰ⧁ āĻ•āϰāĻŦ⧇āĨ¤\n\n## āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āχāύāĻœā§‡āĻļāύ: āĻĄā§‡āĻĄāĻžāĻĒ, āĻ­ā§āϝāĻžāϞāĻŋāĻĄā§‡āϟ, āϤāĻžāϰāĻĒāϰ āύāĻŋāϰāĻžāĻĒāĻĻ⧇ āĻĒā§āϰāϏ⧇āϏ āĻ•āϰ⧁āύ\n\nāĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ• āĻĒā§āϰ⧋āĻ­āĻžāχāĻĄāĻžāϰāϰāĻž āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰ⧇āĨ¤ āϤāĻžāϰāĻž āφāωāϟ-āĻ…āĻĢ-āĻ…āĻ°ā§āĻĄāĻžāϰ⧇ āχāϭ⧇āĻ¨ā§āϟ āĻĒāĻžāĻ āĻžāϝāĻŧāĨ¤ āϝāĻĻāĻŋ āφāĻĒāύāĻžāϰ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĄā§‡āϞāĻŋāĻ­āĻžāϰāĻŋāϤ⧇ āĻ¸ā§āĻŸā§‡āϟ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧇, āφāĻĒāύāĻŋ āĻ…āĻŦāĻļā§āϝāĻŽā§āĻ­āĻžāĻŦā§€āĻ­āĻžāĻŦ⧇ āĻļ⧇āώ⧇ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻĄā§āĻŦāϞ-āĻ•ā§āϰāĻŋāϝāĻŧ⧇āϟ, āĻĄā§āĻŦāϞ-āχāĻŽā§‡āχāϞ āĻĒāĻžāĻ āĻžāύ⧋, āĻŦāĻž āĻĄā§āĻŦāϞ-āϚāĻžāĻ°ā§āϜ āĻĒ⧇āϝāĻŧ⧇ āϝāĻžāĻŦ⧇āύāĨ¤\n\nāĻļ⧁āϰ⧁āϤ⧇āχ āϏ⧇āϰāĻž āĻĄā§‡āĻĄāĻžāĻĒ āϕ⧀ āĻŦ⧇āϛ⧇ āύāĻŋāύāĨ¤ āϝāĻĻāĻŋ āĻĒā§āϰ⧋āĻ­āĻžāχāĻĄāĻžāϰ āφāĻĒāύāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āχāωāύāĻŋāĻ• āχāϭ⧇āĻ¨ā§āϟ ID āĻĻ⧇āϝāĻŧ, āϏ⧇āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύāĨ¤ āϝāĻ–āύ āĻĒā§āϰ⧋āĻ­āĻžāχāĻĄāĻžāϰ āχāϭ⧇āĻ¨ā§āϟ ID āύāĻž āĻĻ⧇āϝāĻŧ, āϤāĻ–āύ āĻĒāϞ⧋āĻĄā§‡āϰ āĻšā§āϝāĻžāĻļ fallback āĻšāĻŋāϏ⧇āĻŦ⧇ āύāĻŋāύāĨ¤\n\nāϏāĻŋāĻ•āĻŋāωāϰāĻŋāϟāĻŋ āĻĒā§āϰāĻĨāĻŽ: āϏāĻŋāĻ—āύ⧇āϚāĻžāϰ āϝāĻžāϚāĻžāχ āĻ•āϰ⧁āύ āφāϗ⧇ āϕ⧀-āϟāĻž āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāĻžāĨ¤ āϏāĻŋāĻ—āύ⧇āϚāĻžāϰ āĻĢ⧇āϞ āĻ•āϰāϞ⧇ āĻ…āύ⧁āϰ⧋āϧ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻ–ā§āϝāĻžāύ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ dedup āϰ⧇āĻ•āĻ°ā§āĻĄ āϞāĻŋāĻ–āĻŦ⧇āύ āύāĻž — āĻ…āĻ¨ā§āϝāĻĨāĻžāϝāĻŧ āĻāĻ•āϜāύ āĻ…ā§āϝāĻžāϟāĻžāĻ•āĻžāϰ āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ ID “āϰāĻŋāϜāĻžāĻ°ā§āĻ­â€ āĻ•āϰ⧇ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āφāϏāϞ āχāϭ⧇āĻ¨ā§āϟ āĻŦā§āϞāĻ• āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤\n\nāϰāĻŋāĻŸā§āϰāĻžāχāϝāĻŧ⧇āϰ āϏāĻŽāϝāĻŧ āύāĻŋāϰāĻžāĻĒāĻĻ āĻĢā§āϞ⧋:\n\n- āϏāĻŋāĻ—āύ⧇āϚāĻžāϰ āĻāĻŦāĻ‚ āĻŦ⧇āϏāĻŋāĻ• āĻļ⧇āĻĒ āϝāĻžāϚāĻžāχ āĻ•āϰ⧁āύ (āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āĻšā§‡āĻĄāĻžāϰ, event ID)\n- event ID āĻāĻ•āϟāĻŋ dedup āĻŸā§‡āĻŦāĻŋāϞ⧇ āχāωāύāĻŋāĻ• āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāĻ¨ā§āϟāϏāĻš insert āĻ•āϰ⧁āύ\n- āϝāĻĻāĻŋ insert āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āĻŸā§‡ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧ, āϏāĻ™ā§āϗ⧇ āϏāĻ™ā§āϗ⧇ 200 āĻĢ⧇āϰāϤ āĻĻāĻŋāύ\n- āĻ…āĻĄāĻŋāϟ āĻ“ āĻĄāĻŋāĻŦāĻžāĻ—āĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āϰ.Raw āĻĒ⧇-āϞ⧋āĻĄ (āĻāĻŦāĻ‚ āĻšā§‡āĻĄāĻžāϰ) āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ āϝāĻ–āύ āĻĻāϰāĻ•āĻžāϰ\n- āĻĒā§āϰāϏ⧇āϏāĻŋāĻ‚ āĻāύāĻ•āĻŋāω āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻĻā§āϰ⧁āϤ 200 āĻĢ⧇āϰāϤ āĻĻāĻŋāύ\n\nāĻĻā§āϰ⧁āϤāĻ­āĻžāĻŦ⧇ acknowlege āĻ•āϰāĻž āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻžāϰāĻŖ āĻ…āύ⧇āĻ• āĻĒā§āϰ⧋āĻ­āĻžāχāĻĄāĻžāϰ⧇āϰ āϛ⧋āϟ āϟāĻžāχāĻŽāφāωāϟ āĻĨāĻžāϕ⧇āĨ¤ āϰāĻŋāϕ⧁āϝāĻŧ⧇āĻ¸ā§āĻŸā§‡ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϛ⧋āϟ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ•āĻžāϜāϟāĻŋ āĻ•āϰ⧁āύ: verify, dedup, persistāĨ¤ āϤāĻžāϰāĻĒāϰ asynchronousāĻ­āĻžāĻŦ⧇ āĻĒā§āϰāϏ⧇āϏ āĻ•āϰ⧁āύ (āĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āĻžāϰ, āĻ•āĻŋāω, āĻŦā§āϝāĻžāĻ•āĻ—ā§āϰāĻžāωāĻ¨ā§āĻĄ āϜāĻŦ)āĨ¤ āϝāĻĻāĻŋ āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ• āύāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ, āĻāĻ•āχ event ID āĻĻāĻŋāϝāĻŧ⧇ āĻ…āĻ­ā§āϝāĻ¨ā§āϤāϰ⧀āĻŖ āϏāĻžāχāĻĄ-āĻāĻĢ⧇āĻ•ā§āϟāϗ⧁āϞāĻŋāϕ⧇ āϕ⧀ āĻ•āϰ⧇ āϕ⧀āϗ⧁āϞāĻŋ āϧāϰ⧇ āϰ⧇āϖ⧇ āĻĒā§āϰāϏ⧇āϏāĻŋāĻ‚āϕ⧇ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϟ āϰāĻžāϖ⧁āύāĨ¤\n\nāφāωāϟ-āĻ…āĻĢ-āĻ…āĻ°ā§āĻĄāĻžāϰ āĻĄā§‡āϞāĻŋāĻ­āĻžāϰāĻŋ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•āĨ¤ āϧāϰ⧇ āύ⧇āĻŦ⧇āύ āύāĻž “created” āφāϗ⧇ āφāϏ⧇ “updated” āĻĨ⧇āϕ⧇āĨ¤ āĻāĻ•ā§āϏāϟāĻžāϰāύāĻžāϞ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ ID-āϤ⧇ upsert āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āĻļ⧇āώ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•ā§ƒāϤ event timestamp āĻŦāĻž version āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰ⧁āύāĨ¤\n\nāϰ āĻ•āĻžāρāϚāĻž āĻĒ⧇-āϞ⧋āĻĄ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāϞ⧇ āĻ—ā§āϰāĻžāĻšāĻ• āĻŦāϞ⧇ “āφāĻŽāϰāĻž āφāĻĒāĻĄā§‡āϟ āĻĒāĻžāχāύāĻŋ” āĻŦāϞāϞ⧇ āϏāĻžāĻšāĻžāĻ¯ā§āϝ āĻ•āϰ⧇āĨ¤ āφāĻĒāύāĻŋ āĻāĻ•āĻŦāĻžāϰ āĻŦāĻžāĻ— āĻ āĻŋāĻ• āĻ•āϰāϞ⧇ āϏāĻ‚āϰāĻ•ā§āώāĻŋāϤ āĻŦāĻĄāĻŋ āĻĨ⧇āϕ⧇ āĻĒā§āϰāϏ⧇āϏāĻŋāĻ‚ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϚāĻžāϞāĻžāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āύ, āĻĒā§āϰ⧋āĻ­āĻžāχāĻĄāĻžāϰāϕ⧇ āφāĻŦāĻžāϰ āϰāĻŋāϏ⧇āĻ¨ā§āĻĄ āĻ•āϰāĻžāϰ āĻ…āύ⧁āϰ⧋āϧ āύāĻž āĻ•āϰ⧇āχāĨ¤\n\n## āĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϏāĻŋ: āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞ āĻ…āύ⧁āϰ⧋āϧ⧇āϰ āϏāĻŽāϝāĻŧ āϏāĻ āĻŋāĻ• āĻĨāĻžāĻ•āĻž\n\nāϰāĻŋāĻŸā§āϰāĻžāχ āĻāĻžāĻŽā§‡āϞāĻž āĻŦāĻžāĻĄāĻŧāĻžāϝāĻŧ āϝāĻ–āύ āĻāĻ•āχ idempotency āϕ⧀ āϏāĻš āĻĻ⧁āϟāĻŋ āĻ…āύ⧁āϰ⧋āϧāχ āĻāĻ•āχ āϏāĻŽāϝāĻŧ⧇ āφāϏ⧇āĨ¤ āϝāĻĻāĻŋ āĻĻ⧁āχ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰāχ “do work” āϧāĻžāĻĒāϟāĻŋ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āĻĻ⧇āϝāĻŧ āφāϗ⧇ āϝ⧇ āϕ⧇āω āĻĢāϞāĻžāĻĢāϞ āϏ⧇āĻ­ āĻ•āϰ⧇, āϤāĻ–āύ āφāĻĒāύāĻŋ āĻāĻ–āύāĻ“ āĻĄāĻŦāϞ āϚāĻžāĻ°ā§āϜ, āĻĄāĻŦāϞ āχāĻŽā§āĻĒā§‹āĻ°ā§āϟ, āĻŦāĻž āĻĄāĻŦāϞ āĻāύāĻ•āĻŋāω āĻĒ⧇āϝāĻŧ⧇ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤\n\nāϏāϰāϞ āϏāĻŽāĻ¨ā§āĻŦāϝāĻŧ⧇āϰ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻšāϞ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āĻŸā§āϰāĻžāĻ¨ā§āϏāĻ…ā§āϝāĻžāĻ•āĻļāύāĨ¤ āĻĒā§āϰāĻĨāĻŽ āϧāĻžāĻĒāϟāĻŋ āĻšā§‹āĻ• “āϕ⧀ āĻ•ā§āϞ⧇āχāĻŽ āĻ•āϰāĻžâ€ āĻāĻŦāĻ‚ āĻĄāĻžāϟāĻžāĻŦ⧇āϜāχ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧁āĻ• āϕ⧇ āϜāϝāĻŧā§€āĨ¤ āϏāĻžāϧāĻžāϰāĻŖ āĻ…āĻĒāĻļāύāϗ⧁āϞ⧋:\n\n- dedup āĻŸā§‡āĻŦāĻŋāϞ⧇ āχāωāύāĻŋāĻ• insert (āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āĻāĻ• āĻŦāĻŋāϜāϝāĻŧā§€ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧇)\n- āϤ⧈āϰāĻŋ (āĻŦāĻž āϖ⧁āρāĻœā§‡) āĻ•āϰāĻžāϰ āĻĒāϰ⧇ SELECT ... FOR UPDATE\n- idempotency key-āĻāϰ āĻšā§āϝāĻžāĻļ āĻĻāĻŋāϝāĻŧ⧇ transaction-level advisory locks\n- āĻŦāĻŋāϜāύ⧇āϏ āϰ⧇āĻ•āĻ°ā§āĻĄā§‡ āχāωāύāĻŋāĻ• āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāĻ¨ā§āϟ āĻāĻ•āϟāĻŋ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻŦā§āϝāĻžāĻ•āĻ¸ā§āϟāĻĒ āĻšāĻŋāϏ⧇āĻŦ⧇\n\nāĻĻā§€āĻ°ā§āϘ āϚāϞāĻŽāĻžāύ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻŦāĻžāχāϰ⧇āϰ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āϰ⧋-āϞāĻ• āϧāϰ⧇āχ āϰāĻžāĻ–āĻŦ⧇āύ āύāĻžāĨ¤ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ dedup āϰ⧋āϤ⧇ āĻāĻ•āϟāĻŋ āϛ⧋āϟ state machine āĻ¸ā§āĻŸā§‹āϰ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ…āύ⧁āϰ⧋āϧ āĻĻā§āϰ⧁āϤ āĻŦ⧇āϰ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤\n\nāĻĒā§āϰāĻžāϝāĻŧā§‹āĻ—āĻŋāĻ• āĻ¸ā§āĻŸā§‡āϟāϏāĻŽā§‚āĻš:\n\n- in_progress āĻāĻŦāĻ‚ started_at\n- completed āĻāĻŦāĻ‚ cached response\n- failed āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ error code (āϐāĻšā§āĻ›āĻŋāĻ•, āφāĻĒāύāĻžāϰ āϰāĻŋāĻŸā§āϰāĻžāχ āύ⧀āϤāĻŋāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇)\n- expires_at (āĻ•ā§āϞāĻŋāύāφāĻĒ⧇āϰ āϜāĻ¨ā§āϝ)\n\nāωāĻĻāĻžāĻšāϰāĻŖ: āĻĻ⧁āχāϟāĻŋ āĻ…ā§āϝāĻžāĻĒ āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ āĻāĻ•āχ āĻĒ⧇āĻŽā§‡āĻ¨ā§āϟ āĻ…āύ⧁āϰ⧋āϧ āĻĒāĻžāϝāĻŧāĨ¤ āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ A āϕ⧀ āχāύāϏāĻžāĻ°ā§āϟ āĻ•āϰ⧇ āĻāĻŦāĻ‚ in_progress āĻŽāĻžāĻ°ā§āĻ• āĻ•āϰ⧇, āϤāĻžāϰāĻĒāϰ āĻĒā§āϰ⧋āĻ­āĻžāχāĻĄāĻžāϰ⧇ āĻ•āϞ āĻ•āϰ⧇āĨ¤ āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ B āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟ āĻĒāĻžāĻĨ āĻšāĻŋāϟ āĻ•āϰ⧇, dedup āϰ⧋ āĻĒāĻĄāĻŧ⧇ in_progress āĻĻ⧇āϖ⧇ āĻĻā§āϰ⧁āϤ “still processing” āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻĻ⧇āϝāĻŧ (āĻ…āĻĨāĻŦāĻž āϏāĻ‚āĻ•ā§āώ⧇āĻĒ⧇ āĻ…āĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻĒ⧁āύāĻ°ā§āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧇)āĨ¤ āϝāĻ–āύ A āĻļ⧇āώ āĻ•āϰ⧇, āĻāϟāĻŋ āϰ⧋ āφāĻĒāĻĄā§‡āϟ āĻ•āϰ⧇ completed āĻāĻŦāĻ‚ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻŦāĻĄāĻŋ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇ āϝāĻžāϤ⧇ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϰāĻŋāĻŸā§āϰāĻžāχ āĻāĻ•āχ āφāωāϟāĻĒ⧁āϟ āĻĒāĻžāϝāĻŧāĨ¤\n\n## āϏāĻžāϧāĻžāϰāĻŖ āϭ⧁āϞ āϝ⧇āϗ⧁āϞ⧋ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āϭ⧇āϙ⧇ āĻĻ⧇āϝāĻŧ\n\nāĻ…āϧāĻŋāĻ•āĻžāĻ‚āĻļ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āĻŦāĻžāĻ— āϜāϟāĻŋāϞ āϞāĻ•āĻŋāĻ‚āϝāĻŧ⧇āϰ āĻŦāĻŋāώāϝāĻŧ⧇ āύāϝāĻŧ; āĻāϗ⧁āϞ⧋ “āĻĒā§āϰāĻžāϝāĻŧ āϏāĻ āĻŋāĻ•â€ āĻĒāĻ›āĻ¨ā§āĻĻāϗ⧁āϞ⧋ āϝ⧇āϗ⧁āϞ⧋ āϰāĻŋāĻŸā§āϰāĻžāχ, āϟāĻžāχāĻŽāφāωāϟ, āĻŦāĻž āĻĻ⧁āχ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻāĻ•āχ āϰāĻ•āĻŽ āĻ•āĻžāϜ āĻ•āϰāϞ⧇ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧāĨ¤\n\nāĻāĻ•āϟāĻŋ āĻ•āĻŽāύ āĻĢāĻžāρāĻĻ āĻšāϞ⧋ idempotency āϕ⧀āϕ⧇ āĻ—ā§āϞ⧋āĻŦāĻžāϞāĻŋ āχāωāύāĻŋāĻ• āϧāϰāĻžāĨ¤ āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āĻāϟāĻŋ āĻ¸ā§āϕ⧋āĻĒ āύāĻž āĻ•āϰ⧇āύ (by user, account, āĻŦāĻž endpoint), āĻĻ⧁āχ āĻ­āĻŋāĻ¨ā§āύ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āϕ⧋āϞāĻžāχāĻĄ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚ āĻāĻ•āϜāύ āĻ…āĻ¨ā§āϝāϜāύ⧇āϰ āϰ⧇āϜāĻžāĻ˛ā§āϟ āĻĒ⧇āϝāĻŧ⧇ āϝāĻžāĻŦ⧇āĨ¤\n\nāφāϰāĻ“ āĻāĻ•āϟāĻŋ āϏāĻŽāĻ¸ā§āϝāĻž āĻšāϞ⧋ āĻāĻ•āχ āϕ⧀āϕ⧇ āĻ­āĻŋāĻ¨ā§āύ āϰāĻŋāϕ⧁āϝāĻŧ⧇āĻ¸ā§āϟ āĻŦāĻĄāĻŋ āύāĻŋāϝāĻŧ⧇ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāĻžāĨ¤ āϝāĻĻāĻŋ āĻĒā§āϰāĻĨāĻŽ āĻ•āϞ $10 āĻāϰ āϜāĻ¨ā§āϝ āĻ›āĻŋāϞ āĻāĻŦāĻ‚ āϰāĻŋāϞ⧇āĻĒ $100, āφāĻĒāύāĻžāϕ⧇ āĻĒā§āϰāĻĨāĻŽ āĻĢāϞāĻžāĻĢāϞ āύāĻŋāĻ°ā§āĻŦāĻŋāϚāĻžāϰ⧇ āĻĢ⧇āϰāϤ āĻĻ⧇āĻ“āϝāĻŧāĻž āωāϚāĻŋāϤ āύāϝāĻŧāĨ¤ request hash āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϰāĻŋāϞ⧇āĻĒ⧇ āϤ⧁āϞāύāĻž āĻ•āϰ⧇ āĻ¸ā§āĻĒāĻˇā§āϟ āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟ āĻāϰāϰ āĻĢ⧇āϰāϤ āĻĻāĻŋāύāĨ¤\n\nāĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāϰāĻž āφāϰāĻ“ āĻŦāĻŋāĻ­ā§āϰāĻžāĻ¨ā§āϤ āĻšāϝāĻŧ āϝāĻ–āύ āϰāĻŋāϞ⧇āĻĒ āĻ­āĻŋāĻ¨ā§āύ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻļ⧇āĻĒ āĻŦāĻž āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϕ⧋āĻĄ āĻĻ⧇āϝāĻŧāĨ¤ āϝāĻĻāĻŋ āĻĒā§āϰāĻĨāĻŽ āĻ•āϞ 201 āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ JSON āĻŦāĻĄāĻŋ āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧ, āϰāĻŋāϞ⧇āĻĒ⧇āĻ“ āĻāĻ•āχ āĻŦāĻĄāĻŋ āĻ“ āϏāĻŽāĻžāύ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϕ⧋āĻĄ āĻĢ⧇āϰāϤ āĻĻāĻŋāύāĨ¤ āϰāĻŋāϞ⧇āĻĒ āφāϚāϰāĻŖ āĻŦāĻĻāϞ⧇ āĻĻāĻŋāϞ⧇ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāϕ⧇ āĻ…āύ⧁āĻŽāĻžāύ āĻ•āϰāϤ⧇ āĻšāϝāĻŧāĨ¤\n\nāĻĒā§āϰāϚāϞāĻŋāϤ āϭ⧁āϞāϗ⧁āϞ⧋ āϝ⧇āϗ⧁āϞ⧋ āĻĒā§āϰāĻžāϝāĻŧāχ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āĻ•āϰ⧇:\n\n- āϕ⧇āĻŦāϞāχ āχāύ-āĻŽā§‡āĻŽāϰāĻŋ āĻŽā§āϝāĻžāĻĒ āĻŦāĻž āĻ•ā§āϝāĻžāĻļ⧇āϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰāĻž, āϤāĻžāϰāĻĒāϰ āϰāĻŋāĻ¸ā§āϟāĻžāĻ°ā§āĻŸā§‡ dedup āĻ¸ā§āĻŸā§‡āϟ āĻšāĻžāϰāĻžāύ⧋\n- āϕ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ¸ā§āϕ⧋āĻĒ āĻ•āϰāĻž āύāĻž (āĻ•ā§āϰāϏ-āχāωāϜāĻžāϰ āĻŦāĻž āĻ•ā§āϰāϏ-āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āϕ⧋āϞāĻŋāĻļāύ)\n- āĻāĻ•āχ āϕ⧀-āϰ āϜāĻ¨ā§āϝ āĻĒ⧇-āϞ⧋āĻĄ āĻŽāĻŋāϞ āύāĻž āĻ•āϰāĻž\n- āĻĒā§āϰāĻĨāĻŽā§‡ āϏāĻžāχāĻĄ-āĻāĻĢ⧇āĻ•ā§āϟ āĻ•āϰāĻž (āϚāĻžāĻ°ā§āϜ, āχāύāϏāĻžāĻ°ā§āϟ, publish) āĻāĻŦāĻ‚ āĻĒāϰ⧇ dedup āϰ⧇āĻ•āĻ°ā§āĻĄ āϞ⧇āĻ–āĻž\n- āĻĒā§āϰāϤāĻŋāϟāĻŋ āϰāĻŋāĻŸā§āϰāĻžāχāϤ⧇ āύāϤ⧁āύ āĻœā§‡āύāĻžāϰ⧇āĻŸā§‡āĻĄ ID āĻĢ⧇āϰāϤ āĻĻ⧇āĻ“āϝāĻŧāĻž, āĻŽā§‚āϞ āϰ⧇āϜāĻžāĻ˛ā§āϟ āϰāĻŋāĻĒā§āϞ⧇ āύāĻž āĻ•āϰāĻž\n\nāĻ•ā§āϝāĻžāĻļ āĻĒāĻĄāĻŧāĻž āĻĻā§āϰ⧁āϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āϏāĻ¤ā§āϝ⧇āϰ āĻ‰ā§ŽāϏ āĻŸā§‡āĻ•āϏāχ āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤ (āϏāĻžāϧāĻžāϰāĻŖāϤ PostgreSQL)āĨ¤ āύāĻžāĻšāϞ⧇ āĻĄāĻŋāĻĒā§āϞāϝāĻŧ⧇āϰ āĻĒāϰ⧇ āϰāĻŋāĻŸā§āϰāĻžāχ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤\n\nāĻ•ā§āϞāĻŋāύāφāĻĒāĻ“ āĻĒāϰāĻŋāĻ•āĻ˛ā§āĻĒāύāĻž āĻ•āϰ⧁āύāĨ¤ āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϕ⧀ āϚāĻŋāϰāĻĻāĻŋāύ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇āύ, āĻŸā§‡āĻŦāĻŋāϞ āĻŦāĻžāĻĄāĻŧāĻŦ⧇ āĻāĻŦāĻ‚ āχāύāĻĄā§‡āĻ•ā§āϏ āϧ⧀āϰ⧇ āϝāĻžāĻŦ⧇āĨ¤ āĻŦāĻžāĻ¸ā§āϤāĻŦ āϰāĻŋāĻŸā§āϰāĻžāχ āφāϚāϰāĻŖ āĻ…āύ⧁āϝāĻžāϝāĻŧā§€ āϰāĻŋāĻŸā§‡āύāĻļāύ āωāχāĻ¨ā§āĻĄā§‹ āϰāĻžāϖ⧁āύ, āĻĒ⧁āϰ⧋āύ⧋ āϰ⧋ āĻŽā§āϛ⧁āύ, āĻāĻŦāĻ‚ āχāωāύāĻŋāĻ• āχāύāĻĄā§‡āĻ•ā§āϏ āϛ⧋āϟ āϰāĻžāϖ⧁āύāĨ¤\n\n## āĻĻā§āϰ⧁āϤ āĻšā§‡āĻ•āϞāĻŋāĻ¸ā§āϟ āĻāĻŦāĻ‚ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϧāĻžāĻĒ\n\nāφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋāϕ⧇ āφāĻĒāύāĻžāϰ API āϚ⧁āĻ•ā§āϤāĻŋāϰ āĻ…āĻ‚āĻļ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰ⧁āύāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āϝāĻž āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ, āĻ•āĻŋāω, āĻŦāĻž āϗ⧇āϟāĻ“āϝāĻŧ⧇ āĻĻā§āĻŦāĻžāϰāĻž āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āϰāĻž āĻšāϤ⧇ āĻĒāĻžāϰ⧇, āϤāĻžāϰ āϜāĻ¨ā§āϝ “āĻāĻ•āχ āĻ…āύ⧁āϰ⧋āĻ§â€ āϕ⧀ āĻŦā§‹āĻāĻžāϝāĻŧ āĻāĻŦāĻ‚ “āĻāĻ•āχ āĻĢāϞāĻžāĻĢāĻ˛â€ āϕ⧇āĻŽāύ āĻšāĻŦ⧇ āϤāĻž āĻ¸ā§āĻĒāĻˇā§āϟ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧁āύāĨ¤\n\nāĻļāĻŋāĻĒ āĻ•āϰāĻžāϰ āφāϗ⧇ āĻāĻ•āϟāĻŋ āĻšā§‡āĻ•āϞāĻŋāĻ¸ā§āϟ:\n\n- āĻĒā§āϰāϤāĻŋāϟāĻŋ āϰāĻŋāĻŸā§āϰāĻžāχāĻāĻŦāϞ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ, āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϏāĻŋ āĻ¸ā§āϕ⧋āĻĒ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ (per user, per account, per order, per external event) āĻāĻŦāĻ‚ āϞāĻŋāϖ⧇ āϰāĻžāĻ–āĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻ•āĻŋ?\n- Dedup āĻ•āĻŋ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āĻĻā§āĻŦāĻžāϰāĻž āĻāύāĻĢā§‹āĻ°ā§āϏ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇ (idempotency key āĻāĻŦāĻ‚ āĻ¸ā§āϕ⧋āĻĒ⧇ āχāωāύāĻŋāĻ• āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāĻ¨ā§āϟ), āϕ⧇āĻŦāϞ āϕ⧋āĻĄā§‡ āĻšā§‡āĻ• āĻ•āϰāĻž āύāϝāĻŧ?\n- āϰāĻŋāϞ⧇āĻĒ⧇, āφāĻĒāύāĻŋ āĻāĻ•āχ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϕ⧋āĻĄ āĻāĻŦāĻ‚ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻŦāĻĄāĻŋ (āĻ…āĻĨāĻŦāĻž āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻĄ āĻ¸ā§āĻĨāĻŋāϰ āϏāĻžāĻŦāϏ⧇āϟ) āĻĢ⧇āϰāϤ āĻĻāĻŋāĻšā§āϛ⧇āύ, āύāĻž āĻ•āĻŋ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻŦāĻž āύāϤ⧁āύ āϟāĻžāχāĻŽāĻ¸ā§āĻŸā§āϝāĻžāĻŽā§āĻĒ?\n- āĻĒ⧇āĻŽā§‡āĻ¨ā§āĻŸā§‡, āϏāĻžāĻŦāĻŽāĻŋāϟ āĻ•āϰāĻžāϰ āĻĒāϰ⧇ āĻ…āϜāĻžāύāĻž āĻĢāϞāĻžāĻĢāϞāϗ⧁āϞ⧋ āύāĻŋāϰāĻžāĻĒāĻĻ⧇ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞ āĻ•āϰāϛ⧇āύ (āϟāĻžāχāĻŽāφāωāϟ, āϗ⧇āϟāĻ“āϝāĻŧ⧇ āĻŦāϞ⧇ “processing”) āϝāĻžāϤ⧇ āĻĻā§â€™āĻŦāĻžāϰ āϚāĻžāĻ°ā§āϜ āύāĻž āĻšāϝāĻŧ?\n- āϞāĻ— āĻ“ āĻŽā§‡āĻŸā§āϰāĻŋāĻ•ā§āϏ āĻ•āĻŋ āϏāĻšāĻœā§‡āχ āĻĻ⧇āĻ–āĻžāϝāĻŧ āĻ•āĻ–āύ āĻ…āύ⧁āϰ⧋āϧ āĻĒā§āϰāĻĨāĻŽ-āĻĻ⧇āĻ–āĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻŦāύāĻžāĻŽ āϰāĻŋāϞ⧇āĻĒ?\n\nāϝāĻĻāĻŋ āϕ⧋āύ⧋ āφāχāĻŸā§‡āĻŽ “āĻšāϝāĻŧāĻ¤ā§‹â€ āĻĨāĻžāϕ⧇, āĻāĻ–āύāχ āĻ āĻŋāĻ• āĻ•āϰ⧁āύāĨ¤ āĻŦ⧇āĻļāĻŋāϰāĻ­āĻžāĻ— āĻŦā§āϝāĻ°ā§āĻĨāϤāĻž āϚāĻžāĻĒ⧇āϰ āϏāĻŽāϝāĻŧāχ āĻĻ⧇āĻ–āĻž āĻĻ⧇āϝāĻŧ: āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞ āϰāĻŋāĻŸā§āϰāĻžāχ, āϧ⧀āϰ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•, āĻ“ āφāĻ‚āĻļāĻŋāĻ• āφāωāĻŸā§‡āϜāĨ¤\n\nāφāĻĒāύāĻŋ āϝāĻĻāĻŋ AppMaster (appmaster.io) āĻāϰ āωāĻĒāϰ⧇ āĻ…āĻ­ā§āϝāĻ¨ā§āϤāϰ⧀āĻŖ āϟ⧁āϞ āĻŦāĻž āĻ•āĻžāĻ¸ā§āϟāĻŽāĻžāϰ-āĻĢ⧇āϏāĻŋāĻ‚ āĻ…ā§āϝāĻžāĻĒ āĻŦāĻžāύāĻžāύ, āϤāĻžāĻšāϞ⧇ āĻļ⧁āϰ⧁āϤ⧇āχ idempotency āϕ⧀āϗ⧁āϞāĻŋ āĻāĻŦāĻ‚ PostgreSQL dedup āĻŸā§‡āĻŦāĻŋāϞ āĻĄāĻŋāϜāĻžāχāύ āĻ•āϰāĻž āϏ⧁āĻŦāĻŋāϧāĻžāϝ⧁āĻ•ā§āϤāĨ¤ āĻāĻ­āĻžāĻŦ⧇, āϝāĻ–āύ āĻĒā§āĻ˛ā§āϝāĻžāϟāĻĢāĻ°ā§āĻŽ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻŦāĻĻāϞāĻžāϞ⧇ Go āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āϕ⧋āĻĄ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰ⧇, āφāĻĒāύāĻžāϰ retry āφāϚāϰāĻŖ āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻ• āĻĨāĻžāĻ•āĻŦ⧇āĨ¤

āĻĒā§āϰāĻļā§āύ⧋āĻ¤ā§āϤāϰ

Why do retries create duplicate charges or duplicate records even when my API is correct?

āϰāĻŋāĻŸā§āϰāĻžāχāϜ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻ•āĻžāϰāĻŖ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻŦāĻž āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻŽāĻžāĻā§‡ āĻŽāĻžāĻā§‡ āĻŦā§āϝāĻ°ā§āĻĨ āĻšāϝāĻŧāĨ¤ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻ…āύ⧁āϰ⧋āϧ āϏāĻĢāϞ āĻšāϞ⧇āĻ“ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āωāĻ¤ā§āϤāϰ āĻĒ⧌āρāĻ›āĻžāϤ⧇ āύāĻžāĻ“ āĻĒāĻžāϰ⧇, āĻĢāϞ⧇ āĻ•ā§āϞāĻžā§Ÿā§‡āĻ¨ā§āϟ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻ…āύ⧁āϰ⧋āϧ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇ āĻāĻ•āĻ• āĻĢāϞāĻžāĻĢāϞ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒā§āϞ⧇ āύāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āϤāĻžāĻšāϞ⧇ āĻāĻ•āχ āĻ•āĻžāϜ āĻĻā§â€™āĻŦāĻžāϰ āĻ•āϰāϤ⧇ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

What should I use as an idempotency key, and who should generate it?

āĻāĻ•āχ āĻ•āĻžāĻœā§‡āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĒ⧁āύāϰāĻžāϝāĻŧāĻšā§‡āĻˇā§āϟāĻžāϝāĻŧ āĻāĻ•āχ āϕ⧀ āĻĒāĻžāĻ āĻžāύāĨ¤ āĻāϟāĻŋ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟāχ āĻœā§‡āύāĻžāϰ⧇āϟ āĻ•āϰāĻž āωāϚāĻŋāϤ — āĻāĻ•āϟāĻŋ āĻ°ā§āϝāĻžāĻ¨ā§āĻĄāĻŽ, āĻ…āύ⧁āĻŽāĻžāύāϝ⧋āĻ—ā§āϝ āύāϝāĻŧ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ (āωāĻĻāĻžāĻšāϰāĻŖ: UUID)āĨ¤ āĻāĻ•āχ āϕ⧀āϕ⧇ āĻ­āĻŋāĻ¨ā§āύ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āύ āύāĻžāĨ¤

How should I scope idempotency keys so they don’t collide across users or tenants?

āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻŦāϏāĻžāϝāĻŧāĻŋāĻ• āĻŦāĻŋāϧāĻŋāϰ āϏāĻ™ā§āϗ⧇ āĻŽāĻŋāϞ āϰ⧇āϖ⧇ āĻ¸ā§āϕ⧋āĻĒ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧁āύ — āϏāĻžāϧāĻžāϰāĻŖāϤ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻĒā§āϞāĻžāϏ āĻ•āϞ āĻ•āϰāĻžāϰ āĻĒāϰāĻŋāϚāϝāĻŧ āϝ⧇āĻŽāύ user, account, tenant, āĻŦāĻž API tokenāĨ¤ āĻāϤ⧇ āĻĻ⧁āχ āĻ­āĻŋāĻ¨ā§āύ āĻ—ā§āϰāĻžāĻšāĻ• āĻāĻ•āχ āϕ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāϕ⧇ āĻ…āĻĒāϰ⧇āϰ āĻĢāϞāĻžāĻĢāϞ āĻĒāĻžāĻŦ⧇ āύāĻžāĨ¤

What should my API return when it receives a duplicate request with the same key?

āĻĒā§āϰāĻĨāĻŽ āϏāĻĢāϞ āĻĒā§āϰāĻšā§‡āĻˇā§āϟāĻžāϰ āĻāĻ•āχ āĻĢāϞāĻžāĻĢāϞ āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āĻĻāĻŋāύāĨ¤ āĻŦāĻžāĻ¸ā§āϤāĻŦ⧇ āĻāϰ āĻŽāĻžāύ⧇ āĻšāϞ⧋ āĻāĻ•āχ HTTP āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ āϕ⧋āĻĄ āĻāĻŦāĻ‚ āĻāĻ•āχ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āĻŦāĻĄāĻŋ (āĻ…āĻĨāĻŦāĻž āĻ…āĻ¨ā§āϤāϤ āĻāĻ•āχ resource ID āĻ“ state) āϰāĻŋāϞ⧇āĻĒ āĻ•āϰāĻž āϝāĻžāϤ⧇ āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āύāĻŋāϰāĻžāĻĒāĻĻ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚ āĻĻā§āĻŦāĻŋāĻ¤ā§€ā§Ÿ āϕ⧋āύ āĻĒāĻžāĻ°ā§āĻļā§āĻŦāĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āύāĻž āϘāĻŸā§‡āĨ¤

What if the client accidentally reuses the same idempotency key with a different request body?

āĻāϟāĻž āĻ•ā§āϞāĻžāϝāĻŧ⧇āĻ¨ā§āϟ āϭ⧁āϞ āĻ•āϰ⧇ āĻāĻ•āχ idempotency āϕ⧀ āĻĻāĻŋāϝāĻŧ⧇ āĻ­āĻŋāĻ¨ā§āύ āĻ…āύ⧁āϰ⧋āϧ āĻĒāĻžāĻ āĻžāϞ⧇ āϤāĻž āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āϟ-āĻ¸ā§āϟāĻžāχāϞ āĻāϰāϰ āĻĻāĻŋāϝāĻŧ⧇ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻ–ā§āϝāĻžāύ āĻ•āϰ⧁āύāĨ¤ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ…āύ⧁āϰ⧋āϧ āĻ•ā§āώ⧇āĻ¤ā§āϰāϗ⧁āϞ⧋āϰ āĻšā§āϝāĻžāĻļ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϕ⧀ āĻŽāĻŋāϞāϞ⧇ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĒ⧇-āϞ⧋āĻĄ āύāĻž āĻŽāĻŋāϞ⧇ āĻĻā§āϰ⧁āϤ āĻ¤ā§āϰ⧁āϟāĻŋ āĻĻ⧇āĻ–āĻžāύ, āϝāĻžāϤ⧇ āĻāĻ•āχ āĻ•ā§€â€™āϤ⧇ āĻĻ⧁āχ āφāϞāĻžāĻĻāĻž āĻ…āĻĒāĻžāϰ⧇āĻļāύ āĻŽāĻŋāĻļ⧇ āύāĻž āϝāĻžāϝāĻŧāĨ¤

How long should I retain idempotency keys in my database?

āĻŦāĻžāĻ¸ā§āϤāĻŦāϏāĻŽā§āĻŽāϤ āϰāĻŋāĻŸā§āϰāĻžāχ āĻ•āĻ­āĻžāϰ āĻ•āϰāĻžāϰ āĻŽāϤ āϏāĻŽāϝāĻŧ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϕ⧀ āϰāĻžāϖ⧁āύ, āϤāĻžāϰāĻĒāϰ āϏ⧇āϗ⧁āϞ⧋ āĻŽā§āϛ⧁āύāĨ¤ āϏāĻžāϧāĻžāϰāĻŖ āĻĄāĻŋāĻĢāĻ˛ā§āϟ: āĻĒ⧇āĻŽā§‡āĻ¨ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ 24–72 āϘāĻ¨ā§āϟāĻž, āχāĻŽā§āĻĒā§‹āĻ°ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻāĻ• āϏāĻĒā§āϤāĻžāĻš, āĻāĻŦāĻ‚ āĻ“āϝāĻŧ⧇āĻŦāĻšā§āĻ•āϗ⧁āϞ⧋āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰ⧇āϰāϕ⧇āϰ āϰāĻŋāĻŸā§āϰāĻžāχ āĻĒāϞāĻŋāϏāĻŋāϰ āϏāĻžāĻĨ⧇ āĻŽā§‡āϞ⧇ āĻāĻŽāύ āĻāĻ•āϟāĻŋ āωāχāĻ¨ā§āĻĄā§‹ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧁āύāĨ¤

What’s the simplest PostgreSQL schema pattern for idempotency?

āĻāĻ•āϟāĻŋ āĻĒ⧃āĻĨāĻ• dedup āĻŸā§‡āĻŦāĻŋāϞ āϖ⧁āĻŦ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻ•āĻžāϰāĻŖ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āχāωāύāĻŋāĻ• āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāĻ¨ā§āϟ āĻāύāĻĢā§‹āĻ°ā§āϏ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϰāĻŋāĻ¸ā§āϟāĻžāĻ°ā§āĻŸā§‡āϰ āĻĒāϰ⧇ āĻŸā§‡āĻ•āϏāχ āĻĨāĻžāϕ⧇āĨ¤ āĻŽāĻžāϞāĻŋāĻ• āĻ¸ā§āϕ⧋āĻĒ, āϕ⧀, āĻāĻ•āϟāĻŋ āĻ…āύ⧁āϰ⧋āϧ āĻšā§āϝāĻžāĻļ, āĻ¸ā§āĻŸā§āϝāĻžāϟāĻžāϏ, āĻāĻŦāĻ‚ āϰāĻŋāĻĒā§āϞ⧇ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϰ⧇āϏāĻĒāĻ¨ā§āϏ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧁āύ; āϤāĻžāϰāĻĒāϰ (owner, key)-āĻ āχāωāύāĻŋāĻ• āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāĻ¨ā§āϟ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āĻļ⧁āϧ⧁ āĻāĻ• āĻ…āύ⧁āϰ⧋āϧāχ “āĻœā§Ÿā§€â€ āĻšā§ŸāĨ¤

How do I handle two identical requests arriving at the same time?

āĻĒā§āϰāĻĨāĻŽā§‡ āĻĄāĻžāϟāĻžāĻŦ⧇āϜ āĻŸā§āϰāĻžāĻ¨ā§āϏāĻ…ā§āϝāĻžāĻ•āĻļāύ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϕ⧀ āĻ•ā§āϞ⧇āχāĻŽ āĻ•āϰ⧁āύ, āϤāĻžāϰāĻĒāϰ āϏāĻžāχāĻĄ-āχāĻĢ⧇āĻ•ā§āϟāϟāĻŋ āϕ⧇āĻŦāϞ āϤāĻ–āύāχ āϚāĻžāϞāĻžāύ āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āϏāĻĢāϞāĻ­āĻžāĻŦ⧇ āĻ•ā§āϞ⧇āχāĻŽ āĻ•āϰ⧇āύāĨ¤ āĻ…āĻ¨ā§āϝ āϝ⧇āϕ⧋āύ⧋ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞ āĻ…āύ⧁āϰ⧋āϧ āχāωāύāĻŋāĻ• āĻ•āύāĻĢā§āϞāĻŋāĻ•ā§āĻŸā§‡ āĻĒ⧌āρāĻ›āĻŦ⧇, in_progress āĻŦāĻž completed āĻĻ⧇āĻ–āĻŦ⧇ āĻāĻŦāĻ‚ āϞāϜāĻŋāĻ•āϟāĻŋ āĻĻā§â€™āĻŦāĻžāϰ āϚāĻžāϞāĻžāύ⧋ āĻĨ⧇āϕ⧇ āĻŦāĻŋāϰāϤ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤

How do I prevent double-charging when the payment gateway times out?

āϟāĻžāχāĻŽāφāωāϟāϕ⧇ “āĻĢ⧇āĻ˛â€ āϧāϰ⧇ āύ⧇āĻŦ⧇āύ āύāĻž; āĻāϟāĻŋāϕ⧇ "āĻ…āĻœā§āĻžāĻžāϤ" āĻšāĻŋāϏ⧇āĻŦ⧇ āĻĻ⧇āϖ⧁āύāĨ¤ āĻāĻ•āϟāĻŋ pending āĻ¸ā§āĻŸā§‡āϟ āϰ⧇āĻ•āĻ°ā§āĻĄ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āϝāĻĻāĻŋ provider ID āĻĨāĻžāϕ⧇, āϏ⧇āϟāĻžāϕ⧇ āϏ⧂āĻ¤ā§āϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āϰāĻŋāĻŸā§āϰāĻžāχ āϕ⧇āĻŦāϞ āĻāĻ•āχ āĻĒ⧇āĻŽā§‡āĻ¨ā§āϟ āϰ⧇āϜāĻžāĻ˛ā§āϟ āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āĻĻ⧇āϝāĻŧ āĻāĻŦāĻ‚ āύāϤ⧁āύ āϚāĻžāĻ°ā§āϜ āϤ⧈āϰāĻŋ āύāĻž āĻ•āϰ⧇āĨ¤

How can I make imports retry-safe without forcing users to start over or creating duplicates?

āĻĻ⧁āχ āĻ¸ā§āϤāϰ⧇ āĻĄā§‡āĻĄāĻžāĻĒ āĻ•āϰ⧁āύ: job-level āĻāĻŦāĻ‚ item-levelāĨ¤ āϰāĻŋ-āĻŸā§āϰāĻžāχ āĻāĻ•āχ import job ID āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āĻĻāĻŋāĻ•, āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϏāĻžāϰāĻŋāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻžāĻ•ā§ƒāϤāĻŋāĻ• āϕ⧀ (external ID āĻŦāĻž (account_id, email) āχāĻ¤ā§āϝāĻžāĻĻāĻŋ) āχāωāύāĻŋāĻ• āĻ•āύāĻ¸ā§āĻŸā§āϰ⧇āχāĻ¨ā§āϟ āĻŦāĻž upsert āĻĻāĻŋāϝāĻŧ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧁āύ āϝāĻžāϤ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒā§āϰāϏ⧇āϏ āĻ•āϰāϞ⧇ āĻĄā§āĻĒā§āϞāĻŋāϕ⧇āϟ āύāĻž āĻšāϝāĻŧāĨ¤

āĻļ⧁āϰ⧁ āĻ•āϰāĻž āϏāĻšāϜ
āĻ•āĻŋāϛ⧁ āφāĻļā§āϚāĻ°ā§āϝāϜāύāĻ•āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ

āĻŦāĻŋāύāĻžāĻŽā§‚āĻ˛ā§āϝ⧇āϰ āĻĒāϰāĻŋāĻ•āĻ˛ā§āĻĒāύāĻž āϏāĻš āĻ…ā§āϝāĻžāĻĒāĻŽāĻžāĻ¸ā§āϟāĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰ⧁āύāĨ¤
āφāĻĒāύāĻŋ āϝāĻ–āύ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āĻšāĻŦ⧇āύ āϤāĻ–āύ āφāĻĒāύāĻŋ āϏāĻ āĻŋāĻ• āϏāĻĻāĻ¸ā§āϝāϤāĻž āĻŦ⧇āϛ⧇ āύāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āύ⧎

āĻāĻŦāĻžāϰ āĻļ⧁āϰ⧁ āĻ•āϰāĻž āϝāĻžāĻ•
Go-āϤ⧇ āφāχāĻĄā§‡āĻŽā§āĻĒā§‹āĻŸā§‡āĻ¨ā§āϟ āĻāĻ¨ā§āĻĄāĻĒāϝāĻŧ⧇āĻ¨ā§āϟ: āϕ⧀, āĻĄā§‡āĻĄā§āĻĒ āĻŸā§‡āĻŦāĻŋāϞ, āϰāĻŋāĻŸā§āϰāĻžāχ | AppMaster