> ## Documentation Index
> Fetch the complete documentation index at: https://resend.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# AI Onboarding

> Everything you need to onboard your AI agent to Resend.

export const PicaIcon = props => <svg className="h-6 w-6" width="81" height="81" viewBox="0 0 81 81" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
    <title>{'Pica'}</title>
    <path fillRule="evenodd" clipRule="evenodd" d="M63.2164 31.6746C58.5597 31.6849 54.7765 35.4817 54.7663 40.1551C54.7559 44.8283 58.5225 48.6083 63.179 48.5979L77.8273 48.5655C79.3265 48.5622 80.5428 49.7828 80.5395 51.2874C80.5361 52.7821 79.3296 53.9928 77.8402 53.9961L66.9424 54.0203C60.2703 54.035 54.8496 59.4753 54.8348 66.1712L54.8092 77.8042C54.8056 79.4728 53.4588 80.8243 51.7962 80.828C50.1228 80.8318 48.7651 79.4692 48.7688 77.7898L48.8013 63.0273C48.8116 58.354 45.0451 54.5739 40.3884 54.5843C35.7319 54.5945 31.9487 58.3914 31.9383 63.0647L31.9056 77.9806C31.902 79.5797 30.6115 80.8749 29.0181 80.8785C27.4144 80.8821 26.1134 79.5763 26.1168 77.9668L26.1427 66.2348C26.1573 59.5389 20.7605 54.1227 14.0884 54.1374L2.71207 54.1626C1.21295 54.1659 -0.0033077 52.9453 6.7582e-06 51.4409C0.00329407 49.9461 1.20973 48.7353 2.69914 48.732L17.624 48.699C22.2805 48.6886 26.0638 44.8918 26.074 40.2186C26.0844 35.5453 22.3178 31.7652 17.6611 31.7756L3.01408 31.808C1.37551 31.8116 0.0461153 30.4774 0.0497358 28.8331C0.0533261 27.1992 1.372 25.8759 2.99995 25.8723L14.1506 25.8476C20.8228 25.8328 26.2435 20.3926 26.2583 13.6966L26.2818 2.94826C26.2854 1.34923 27.5759 0.054002 29.1693 0.0504723C30.7731 0.0469191 32.0741 1.35269 32.0706 2.96214L32.039 17.3462C32.0287 22.0196 35.7952 25.7996 40.4517 25.7892C45.1084 25.779 48.8916 21.9822 48.9018 17.3089L48.9333 3.02378C48.937 1.35524 50.2837 0.00369132 51.9463 7.55018e-06C53.6197 -0.00370043 54.9774 1.35884 54.9737 3.03827L54.9504 13.633C54.9357 20.3291 60.3326 25.7453 67.0046 25.7304L77.6248 25.7069C79.2633 25.7033 80.5927 27.0374 80.5891 28.6819C80.5856 30.3157 79.2669 31.6391 77.6389 31.6427L63.2164 31.6746ZM48.851 40.4207C48.8615 35.6777 45.0388 31.8412 40.3126 31.8517C35.5866 31.8621 31.7469 35.7156 31.7364 40.4586C31.7259 45.2016 35.5488 49.0381 40.2748 49.0276C45.0009 49.0172 48.8406 45.1637 48.851 40.4207Z" fill="currentColor" />
  </svg>;

export const ParsleyIcon = props => <svg className="h-6 w-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 489 470" preserveAspectRatio="xMidYMid meet" fill="none" {...props}>
    <title>Parsley</title>
    <g transform="translate(-227.54,642.62) scale(0.1,-0.1)" fill="currentColor">
      <path d="M4585 6420 c-11 -5 -65 -9 -120 -10 -129 -2 -217 -11 -435 -46 -385 -62 -644 -202 -744 -404 -95 -192 -121 -326 -111 -580 5 -139 11 -178 35 -245 4 -11 13 -38 20 -60 50 -161 156 -291 315 -387 138 -82 147 -88 192 -119 21 -14 83 -52 138 -83 120 -68 131 -75 170 -101 17 -11 50 -31 75 -44 25 -13 52 -30 60 -36 14 -12 114 -68 260 -147 97 -52 148 -63 295 -63 100 0 143 4 185 19 80 27 203 87 306 150 49 30 112 67 139 82 28 14 59 34 70 44 11 9 45 32 75 49 30 18 93 57 140 87 47 30 92 57 100 61 8 3 22 12 30 19 8 6 31 21 50 31 130 73 159 93 220 152 75 74 152 198 176 282 9 30 20 70 26 89 6 19 13 64 15 100 2 36 8 74 14 86 17 34 -1 257 -30 369 -44 173 -42 168 -89 250 -42 73 -139 175 -211 222 -57 37 -155 83 -177 83 -7 0 -39 11 -71 24 -61 25 -139 45 -288 71 -49 9 -110 21 -135 26 -40 9 -299 24 -575 34 -55 3 -109 0 -120 -5z" />
      <path d="M3040 4509 c-19 -6 -51 -14 -70 -19 -46 -12 -173 -95 -231 -151 -51 -50 -179 -237 -179 -262 0 -9 -4 -18 -9 -21 -5 -3 -19 -32 -31 -63 -13 -32 -29 -74 -37 -93 -53 -127 -97 -274 -124 -412 -15 -78 -27 -140 -39 -193 -41 -184 -52 -336 -40 -570 10 -229 17 -300 29 -330 5 -11 14 -40 21 -65 6 -25 16 -53 21 -62 5 -10 9 -23 9 -28 0 -6 19 -50 41 -98 35 -72 57 -102 128 -172 96 -95 152 -128 286 -172 146 -48 242 -62 415 -62 142 1 351 17 370 29 4 3 41 12 82 20 157 31 209 45 340 89 267 90 408 183 494 328 38 65 49 92 67 168 14 61 21 1120 7 1134 -5 5 -10 24 -10 41 0 37 -37 135 -72 190 -30 47 -141 165 -155 165 -6 0 -26 12 -46 28 -36 27 -66 46 -147 92 -25 14 -59 35 -77 48 -17 12 -34 22 -38 22 -3 0 -23 13 -43 29 -20 16 -53 37 -72 47 -19 10 -42 24 -50 30 -16 13 -67 42 -141 81 -26 13 -53 31 -60 39 -6 8 -16 14 -21 14 -6 0 -24 10 -41 23 -18 12 -41 27 -52 33 -11 5 -56 30 -100 54 -44 24 -105 50 -135 59 -66 17 -241 23 -290 10z" />
      <path d="M6175 4510 c-11 -5 -31 -9 -45 -9 -32 -1 -214 -94 -285 -145 -16 -12 -109 -69 -205 -126 -166 -98 -284 -171 -340 -210 -14 -10 -46 -28 -70 -40 -25 -13 -63 -38 -86 -56 -23 -19 -45 -34 -50 -34 -11 0 -101 -92 -137 -141 -15 -19 -41 -69 -58 -110 -31 -72 -32 -81 -42 -289 -19 -423 -8 -951 23 -1017 5 -13 15 -35 21 -50 36 -88 80 -145 169 -220 101 -84 315 -180 515 -231 90 -23 172 -42 210 -48 22 -3 51 -10 65 -15 23 -9 175 -24 365 -36 44 -3 109 0 145 6 36 5 94 14 130 20 124 17 186 40 339 122 76 42 161 136 207 230 110 224 117 264 116 689 0 351 -12 506 -52 653 -5 20 -15 56 -21 80 -26 103 -32 123 -39 142 -4 11 -20 58 -35 105 -14 47 -32 99 -40 115 -7 17 -27 64 -45 105 -93 221 -232 389 -385 464 -83 40 -318 70 -370 46z" />
    </g>
  </svg>;

export const LeapNewIcon = props => <svg className="h-6 w-6" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
    <title>{'Leap.new'}</title>
    <g clipPath="url(#clip0_1111_9)">
      <path d="M12.0515 12.0071V0.0585938H24V12.0071H12.0515ZM0.103027 23.9557V12.0071H12.0515V23.9557H0.103027Z" fill="currentColor" />
    </g>
    <defs>
      <clipPath id="clip0_1111_9">
        <rect width="24" height="24" fill="currentColor" />
      </clipPath>
    </defs>
  </svg>;

export const Base44Icon = props => <svg className="h-6 w-6" width="159" height="159" viewBox="0 0 159 159" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
    <title>{'Base44'}</title>
    <path d="M122.471 133.996C110.721 143.22 95.9081 148.721 79.8113 148.721C63.7148 148.721 48.903 143.22 37.1531 133.996H122.471ZM140.073 113.498C137.592 117.896 134.644 121.995 131.296 125.729H28.327C24.9786 121.995 22.0304 117.896 19.5496 113.498H140.073ZM147.648 93C146.817 97.2278 145.6 101.317 144.036 105.23H15.5867C14.0225 101.317 12.806 97.2278 11.9744 93H147.648ZM79.8113 10.4414C117.996 10.4414 148.951 41.3963 148.951 79.5811C148.951 81.3138 148.887 83.0317 148.762 84.7324H10.8621C10.7369 83.0316 10.6717 81.3138 10.6717 79.5811C10.6717 41.3963 41.6266 10.4415 79.8113 10.4414Z" fill="currentColor" />
  </svg>;

export const RocketIcon = props => <svg className="h-6 w-6" width="121" height="127" viewBox="0 0 121 127" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
    <title>{'Rocket'}</title>
    <path d="M108.729 108.725L93.6186 94.4048C82.9086 84.2448 75.4986 71.1048 72.3386 56.6948L62.5386 12.1348C62.3086 11.1348 61.4786 10.6348 60.6486 10.6348C59.8186 10.6348 58.9986 11.1348 58.7586 12.1348L48.9586 56.7048C45.7886 71.1148 38.3886 84.2548 27.6786 94.4148L12.5686 108.735C11.1586 110.245 10.3686 112.235 10.3686 114.305V116.115L48.6886 109.495C52.6386 108.815 56.6486 108.465 60.6386 108.465C64.6286 108.465 68.6386 108.815 72.5886 109.495L110.909 116.115V114.305C110.909 112.235 110.119 110.245 108.709 108.735L108.729 108.725Z" fill="currentColor" />
  </svg>;

export const McpRunIcon = props => <svg className="h-6 w-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 570 126" {...props}>
    <title>{'mcp.run'}</title>
    <g>
      <g>
        <g>
          <rect className="cls-2" x="0" y="0" width="18" height="18" />
          <rect className="cls-2" y="18" width="18" height="18" />
          <rect className="cls-2" x="0" y="36" width="18" height="18" />
          <rect className="cls-2" x="0" y="54" width="18" height="18" />
          <rect className="cls-2" y="72" width="18" height="18" />
          <rect className="cls-2" x="36" y="0" width="18" height="18" />
          <rect className="cls-2" x="36" y="18" width="18" height="18" />
          <rect className="cls-2" x="36" y="36" width="18" height="18" />
          <rect className="cls-2" x="36" y="54" width="18" height="18" />
          <rect className="cls-2" x="36" y="72" width="18" height="18" />
          <rect className="cls-2" x="72" y="0" width="18" height="18" />
          <rect className="cls-2" x="72" y="18" width="18" height="18" />
          <rect className="cls-2" x="72" y="36" width="18" height="18" />
          <rect className="cls-2" x="72" y="54" width="18" height="18" />
          <rect className="cls-2" x="72" y="72" width="18" height="18" />
          <polygon className="cls-2" points="11.12 18 36 18 36 0 11.12 18" />
          <polygon className="cls-2" points="47.12 18 72 18 72 0 47.12 18" />
        </g>
        <g>
          <rect className="cls-2" x="126" y="0" width="18" height="18" transform="translate(126 144) rotate(-90)" />
          <rect className="cls-2" x="126" y="72" width="18" height="18" transform="translate(54 216) rotate(-90)" />
          <rect className="cls-2" x="144" y="0" width="18" height="18" transform="translate(144 162) rotate(-90)" />
          <rect className="cls-2" x="144" y="72" width="18" height="18" transform="translate(72 234) rotate(-90)" />
          <rect className="cls-2" x="162" y="0" width="18" height="18" transform="translate(162 180) rotate(-90)" />
          <rect className="cls-2" x="162" y="72" width="18" height="18" transform="translate(90 252) rotate(-90)" />
          <rect className="cls-2" x="99" y="18" width="18" height="18" />
          <rect className="cls-2" x="99" y="36" width="18" height="18" />
          <rect className="cls-2" x="99" y="54" width="18" height="18" />
          <polygon className="cls-2" points="99 18 126 18 126 0 99 18" />
          <polygon className="cls-2" points="99 72 126 72 126 90 99 72" />
        </g>
        <g>
          <rect className="cls-2" x="189" y="0" width="18" height="18" transform="translate(189 207) rotate(-90)" />
          <rect className="cls-2" x="207" y="0" width="18" height="18" transform="translate(207 225) rotate(-90)" />
          <rect className="cls-2" x="225" y="0" width="18" height="18" transform="translate(225 243) rotate(-90)" />
          <rect className="cls-2" x="189" y="72" width="18" height="18" transform="translate(117 279) rotate(-90)" />
          <rect className="cls-2" x="207" y="72" width="18" height="18" transform="translate(135 297) rotate(-90)" />
          <rect className="cls-2" x="225" y="72" width="18" height="18" transform="translate(153 315) rotate(-90)" />
          <rect className="cls-2" x="189" y="18" width="18" height="18" />
          <rect className="cls-2" x="189" y="36" width="18" height="18" />
          <rect className="cls-2" x="189" y="54" width="18" height="18" />
          <rect className="cls-2" x="189" y="90" width="18" height="18" />
          <rect className="cls-2" x="189" y="108" width="18" height="18" />
          <rect className="cls-2" x="252" y="18" width="18" height="18" />
          <rect className="cls-2" x="252" y="36" width="18" height="18" />
          <rect className="cls-2" x="252" y="54" width="18" height="18" />
          <polygon className="cls-2" points="270 18 243 18 243 0 270 18" />
          <polygon className="cls-2" points="270 72 243 72 243 90 270 72" />
        </g>
        <g>
          <rect className="cls-2" x="552" y="18" width="18" height="18" />
          <rect className="cls-2" x="552" y="36" width="18" height="18" />
          <rect className="cls-2" x="489" y="18" width="18" height="18" />
          <rect className="cls-2" x="489" y="36" width="18" height="18" />
          <rect className="cls-2" x="552" y="0" width="18" height="18" transform="translate(570 -552) rotate(90)" />
          <rect className="cls-2" x="529.5" y="-4.5" width="18" height="27" transform="translate(547.5 -529.5) rotate(90)" />
          <rect className="cls-2" x="552" y="54" width="18" height="18" transform="translate(624 -498) rotate(90)" />
          <rect className="cls-2" x="507" y="0" width="18" height="18" transform="translate(525 -507) rotate(90)" />
          <rect className="cls-2" x="489" y="54" width="18" height="18" transform="translate(561 -435) rotate(90)" />
          <rect className="cls-2" x="552" y="72" width="18" height="18" transform="translate(642 -480) rotate(90)" />
          <rect className="cls-2" x="489" y="72" width="18" height="18" transform="translate(579 -417) rotate(90)" />
          <polygon className="cls-2" points="516 18 489 18 489 0 516 18" />
        </g>
        <g>
          <polygon className="cls-2" points="399 72 426 72 426 90 399 72" />
          <rect className="cls-2" x="399" y="54" width="18" height="18" transform="translate(816 126) rotate(180)" />
          <rect className="cls-2" x="399" y="36" width="18" height="18" transform="translate(816 90) rotate(180)" />
          <rect className="cls-2" x="462" y="54" width="18" height="18" transform="translate(942 126) rotate(180)" />
          <rect className="cls-2" x="462" y="36" width="18" height="18" transform="translate(942 90) rotate(180)" />
          <polygon className="cls-2" points="435 72 435 90 417 81 417 72 435 72" />
          <rect className="cls-2" x="430.5" y="67.5" width="18" height="27" transform="translate(358.5 520.5) rotate(-90)" />
          <rect className="cls-2" x="399" y="18" width="18" height="18" transform="translate(381 435) rotate(-90)" />
          <polygon className="cls-2" points="462 72 462 81 444 90 444 72 462 72" />
          <rect className="cls-2" x="462" y="0" width="18" height="18" transform="translate(462 480) rotate(-90)" />
          <rect className="cls-2" x="399" width="18" height="18" transform="translate(399 417) rotate(-90)" />
          <rect className="cls-2" x="462" y="18" width="18" height="18" transform="translate(444 498) rotate(-90)" />
          <polygon className="cls-2" points="480 72 453 72 453 90 480 72" />
        </g>
        <g>
          <rect className="cls-2" x="336" y="0" width="18" height="18" transform="translate(336 354) rotate(-90)" />
          <rect className="cls-2" x="354" y="0" width="18" height="18" transform="translate(354 372) rotate(-90)" />
          <rect className="cls-2" x="372" y="0" width="18" height="18" transform="translate(372 390) rotate(-90)" />
          <rect className="cls-2" x="318" y="72" width="18" height="18" transform="translate(246 408) rotate(-90)" />
          <rect className="cls-2" x="318" y="18" width="18" height="18" />
          <rect className="cls-2" x="318" y="36" width="18" height="18" />
          <rect className="cls-2" x="318" y="54" width="18" height="18" />
          <polygon className="cls-2" points="345 18 318 18 318 0 345 18" />
        </g>
      </g>
      <rect className="cls-1" x="280.88" y="50.37" width="25.26" height="25.26" transform="translate(-6.32 77.77) rotate(-14.93)" />
    </g>
  </svg>;

export const WildcardIcon = props => <svg className="h-6 w-6" width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg" {...props}>
    <title>{'Wildcard'}</title>
    <defs fill="currentColor" id="defs1" />
    <path d="m44,32l11.78,6.8-6,10.39-11.78-6.8v13.61h-12v-13.61l-11.78,6.8-6-10.39,11.78-6.8-11.78-6.8,6-10.39,11.78,6.8v-13.61h12v13.61l11.78-6.8,6,10.39-11.78,6.8Z" fill="currentColor" />
  </svg>;

export const AnythingIcon = props => <svg className="h-6 w-6" width="97" height="100" viewBox="0 0 97 100" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
    <title>{'Anything'}</title>
    <path d="M84.2829 96.286C89.269 75.7132 93.7568 55.6139 93.9185 35.9376C94.0751 16.4376 89.7641 10.1999 86.5099 7.20085C85.8404 6.58277 85.1171 6.0387 84.3605 5.57696C81.7207 3.96559 78.5784 3.28239 74.752 3.48907C66.1585 3.95218 53.56 9.57643 38.3173 19.7567C22.4623 30.3451 9.05946 42.2082 5.33074 45.5938C5.22428 45.6911 5.05302 45.8388 4.84081 46.0254C4.19915 46.5866 3.64115 47.0877 3.18632 47.5108C3.05153 47.6337 3.04057 47.8407 3.16012 47.9948C3.1942 48.037 3.23208 48.0729 3.27877 48.1014C3.39396 48.1717 3.53522 48.1853 3.6595 48.1287C4.5571 47.7153 5.49911 47.222 6.41155 46.7492C7.44585 46.2097 8.50903 45.658 9.46801 45.235C17.3073 41.7862 27.6006 37.6006 37.6684 35.807C48.85 33.813 56.5565 34.586 62.6643 38.3142C67.8972 41.5084 71.49 45.0517 74.3123 49.8082C77.3625 54.9474 79.5651 61.6501 81.2392 70.9058C82.7572 79.2971 83.1466 87.8714 83.5238 96.1646C83.5291 96.296 83.6088 96.4172 83.7241 96.4875C83.7707 96.5161 83.8231 96.5352 83.8781 96.5432C84.0718 96.5759 84.2484 96.4615 84.2929 96.2836L84.2829 96.286Z" fill="currentColor" />
    <path d="M70.3756 85.1586C70.2252 76.2348 69.8684 55.336 58.319 48.2863C58.0762 48.1381 57.8234 47.9923 57.571 47.8597C52.0261 44.8895 44.5351 44.8206 35.2986 47.6601C27.9612 49.9154 21.6293 53.3656 18.9266 54.8394C18.4392 55.1058 18.0824 55.2983 17.8739 55.4018C17.71 55.4812 17.6417 55.6703 17.7104 55.8446C17.7442 55.9294 17.8069 56.0017 17.8815 56.0473C17.9562 56.093 18.0555 56.1193 18.1532 56.1063C18.264 56.0928 18.3791 56.0862 18.4993 56.0783C18.7083 56.0649 18.9205 56.0534 19.136 56.0012C36.5276 51.8627 45.3418 55.1962 51.0756 58.5638C51.1535 58.6113 51.2313 58.6588 51.3091 58.7062C60.6202 64.3898 67.0919 80.8639 69.2168 86.28C69.4137 86.7763 69.5671 87.1691 69.6771 87.437C69.7127 87.5186 69.7722 87.5891 69.8438 87.6328C69.9247 87.6822 70.0209 87.7067 70.1155 87.6918C70.2977 87.6663 70.4264 87.5184 70.4222 87.3363C70.4016 86.747 70.3885 86.0125 70.3736 85.1617L70.3756 85.1586Z" fill="currentColor" />
  </svg>;

export const LovableIcon = props => <svg className="h-6 w-6" viewBox="0 0 78 69" fill="none" xmlns="http://www.w3.org/2000/svg" {...props}>
    <title>{'Lovable'}</title>
    <path d="M38.768 69C37.9927 69 37.2119 68.8597 36.4255 68.5791C35.6398 68.2993 34.9562 67.8684 34.3747 67.2869L28.7204 62.0831C21.096 55.0378 14.4033 48.2348 8.64237 41.6741C2.88079 35.1136 0 28.1383 0 20.7484C0 14.8451 1.98137 9.91108 5.94412 5.94627C9.90752 1.98209 14.8181 0 20.676 0C24.0146 0 27.2669 0.770147 30.4329 2.31044C33.599 3.85139 36.3774 6.24845 38.768 9.50161C41.3739 6.24845 44.1953 3.85139 47.232 2.31044C50.2688 0.770147 53.4785 0 56.8602 0C62.7179 0 67.6288 1.98209 71.5921 5.94627C75.555 9.91108 77.5361 14.8451 77.5361 20.7484C77.5361 28.1383 74.6611 35.119 68.9103 41.6906C63.1595 48.2624 56.4504 55.0708 48.783 62.1161L43.1614 67.2869C42.5799 67.8684 41.8964 68.2993 41.1106 68.5791C40.3244 68.8597 39.5435 69 38.768 69Z" fill="currentColor" />
  </svg>;

If you're developing with AI, Resend offers several resources to improve your experience.

* [Resend MCP Server](#resend-mcp-server)
* [Resend CLI](#resend-cli)
* [Resend Docs for Agents](#resend-docs-for-agents)
* [Email Skills for Agents](#email-skills-for-agents)
* [Quick Start Guides](#quick-start-guides)
* [OpenClaw Guide](#openclaw-guide)
* [Chat SDK](#chat-sdk)
* [AI Builder Guides](#ai-builder-guides)
* [AI Integrations](#ai-integrations)

## Prerequisite: Create an API Key

Currently, we require a human to create a Resend account. Once you have an account, you'll need to [create an API key](https://resend.com/api-keys). With an API key, your agent can perform many other tasks.

<Info>
  To send or receive with Resend, you'll need to [verify a domain](https://resend.com/domains). While an agent can [create a domain](/api-reference/domains/create-domain), the API returns DNS records you will need to add in your DNS provider before [verifying your DNS records](/api-reference/domains/verify-domain). You may find it easier to verify your domain in the dashboard.
</Info>

## Resend MCP Server

MCP is an open protocol that standardizes how applications provide context to LLMs. Among other benefits, it provides LLMs tools to act on your behalf. Our [MCP server](https://github.com/resend/resend-mcp) is open-source and covers our full API surface area.

The Resend MCP server is available on NPM and can be added to any supported MCP client. For example:

```json theme={"theme":{"light":"github-light","dark":"vesper"}}
{
  "mcpServers": {
    "resend": {
      "command": "npx",
      "args": ["-y", "resend-mcp"],
      "env": {
        "RESEND_API_KEY": "re_xxxxxxxxx"
      }
    }
  }
}
```

<Card title="MCP Server" icon="microchip-ai" href="/mcp-server">
  View installation instructions for Cursor, Codex, Claude Desktop, Windsurf,
  and more.
</Card>

## Resend CLI

The Resend CLI lets you send emails, manage your account, and develop locally, all from the terminal. It's built for humans, AI agents, and CI/CD pipelines.

```bash theme={"theme":{"light":"github-light","dark":"vesper"}}
# Authenticate
resend login

# Send an email
resend emails send \
  --from "you@example.com" \
  --to hello@example.com \
  --subject "Hello" \
  --text "Sent from my terminal."
```

The CLI also includes a full local webhook setup for developing with inbound email events without deploying anything.

<Card title="Resend CLI" icon="terminal" href="/cli">
  Install the CLI and set up a local webhook development environment.
</Card>

## Resend Docs for Agents

You can give your agent current docs in a context-aware way in three ways:

1. **Markdown docs**

   Every doc includes a markdown version (append `md` to any page)

   ```
   Docs for this page: https://resend.com/docs/ai-onboarding.md
   ```

2. **Full llms.txt**

   Give your agent all our docs in a single file.

   ```
   Here are the Resend docs: https://resend.com/docs/llms-full.txt
   ```

3. **MCP Docs server**

   For a more structured approach using MCP tools, you can install our MCP docs server in any MCP client, like Cursor, Codex, or Claude Code.

   ```
   npx add-mcp https://resend.com/docs/mcp
   ```

## Email Skills for Agents

Skills give AI agents specialized knowledge for specific tasks.

Install skills with a single command:

```bash theme={"theme":{"light":"github-light","dark":"vesper"}}
npx skills add resend/resend-skills
```

Or install individually:

| Skill                                               | Install                                      | What it does                                                                                                       |
| --------------------------------------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| [Resend](/resend-skill)                             | `npx skills add resend/resend-skills`        | Send and receive emails, handle errors, prevent duplicate sends, get code examples from various SDKs               |
| [React Email](/react-email-skill)                   | `npx skills add resend/react-email`          | Build emails in React, Tailwind, and TypeScript. Audit existing React emails for style and cross-client rendering. |
| [Email Best Practices](/email-best-practices-skill) | `npx skills add resend/email-best-practices` | Audit SPF/DKIM/DMARC setup, compliance (CAN-SPAM, GDPR), webhook handling                                          |

## Quick Start Guides

Throughout our documentation, we provide quick start guides for common tasks with Resend. They contain step-by-step instructions for sending emails, creating templates, and more. Copy the prompt for your agent or click to open in Cursor.

<Prompt description="Example agent quick start guide for sending emails." icon="envelope" actions={["copy", "cursor"]}>
  Resend provides two endpoints for sending emails:

  | Approach   | Endpoint             | Use Case                                                                  |
  | ---------- | -------------------- | ------------------------------------------------------------------------- |
  | **Single** | `POST /emails`       | Individual transactional emails, emails with attachments, scheduled sends |
  | **Batch**  | `POST /emails/batch` | Multiple distinct emails in one request (max 100), bulk notifications     |

  **Choose batch when:**

  * Sending 2+ distinct emails at once
  * Reducing API calls is important (by default, rate limit is 2 requests per second)
  * No attachments or scheduling needed

  **Choose single when:**

  * Sending one email
  * Email needs attachments
  * Email needs to be scheduled
  * Different recipients need different timing

  ## Quick Start

  1. **Detect project language** from config files (package.json, requirements.txt, go.mod, etc.)
  2. **Install SDK** (preferred) or use cURL
  3. **Choose single or batch** based on the decision matrix above
  4. **Implement best practices** - Idempotency keys, error handling, retries

  ## Best Practices (Critical for Production)

  Always implement these for production email sending.

  ### Idempotency Keys

  Prevent duplicate emails when retrying failed requests.

  | Key Facts             |                                                                  |
  | --------------------- | ---------------------------------------------------------------- |
  | **Format (single)**   | `<event-type>/<entity-id>` (e.g., `welcome-email/user-123`)      |
  | **Format (batch)**    | `batch-<event-type>/<batch-id>` (e.g., `batch-orders/batch-456`) |
  | **Expiration**        | 24 hours                                                         |
  | **Max length**        | 256 characters                                                   |
  | **Duplicate payload** | Returns original response without resending                      |
  | **Different payload** | Returns 409 error                                                |

  ### Error Handling

  | Code     | Action                                                                                      |
  | -------- | ------------------------------------------------------------------------------------------- |
  | 400, 422 | Fix request parameters, don't retry                                                         |
  | 401, 403 | Check API key / verify domain, don't retry                                                  |
  | 409      | Idempotency conflict - use new key or fix payload                                           |
  | 429      | Rate limited - retry with exponential backoff (by default, rate limit is 2 requests/second) |
  | 500      | Server error - retry with exponential backoff                                               |

  ### Retry Strategy

  * **Backoff:** Exponential (1s, 2s, 4s...)
  * **Max retries:** 3-5 for most use cases
  * **Only retry:** 429 (rate limit) and 500 (server error)
  * **Always use:** Idempotency keys when retrying

  ## Single Email

  **Endpoint:** `POST /emails` (prefer SDK over cURL)

  ### Required Parameters

  | Parameter        | Type      | Description                                         |
  | ---------------- | --------- | --------------------------------------------------- |
  | `from`           | string    | Sender address. Format: `"Name <email@domain.com>"` |
  | `to`             | string\[] | Recipient addresses (max 50)                        |
  | `subject`        | string    | Email subject line                                  |
  | `html` or `text` | string    | Email body content                                  |

  ### Optional Parameters

  | Parameter        | Type      | Description                       |
  | ---------------- | --------- | --------------------------------- |
  | `cc`             | string\[] | CC recipients                     |
  | `bcc`            | string\[] | BCC recipients                    |
  | `reply_to`\*     | string\[] | Reply-to addresses                |
  | `scheduled_at`\* | string    | Schedule send time (ISO 8601)     |
  | `attachments`    | array     | File attachments (max 40MB total) |
  | `tags`           | array     | Key/value pairs for tracking      |
  | `headers`        | object    | Custom headers                    |

  \*Parameter naming varies by SDK (e.g., `replyTo` in Node.js, `reply_to` in Python).

  ### Minimal Example (Node.js)

  ```typescript theme={"theme":{"light":"github-light","dark":"vesper"}}
  import { Resend } from 'resend';

  const resend = new Resend('YOUR_RESEND_API_KEY');

  const { data, error } = await resend.emails.send(
    {
      from: 'Acme <onboarding@resend.dev>',
      to: ['delivered@resend.dev'],
      subject: 'Hello World',
      html: '<p>Email body here</p>',
    },
    { idempotencyKey: `welcome-email/${userId}` },
  );

  if (error) {
    console.error('Failed:', error.message);
    return;
  }
  console.log('Sent:', data.id);
  ```

  ## Batch Email

  **Endpoint:** `POST /emails/batch` (but prefer SDK over cURL)

  ### Limitations

  * **No attachments** - Use single sends for emails with attachments
  * **No scheduling** - Use single sends for scheduled emails
  * **Atomic** - If one email fails validation, the entire batch fails
  * **Max 100 emails** per request
  * **Max 50 recipients** per individual email in the batch

  ### Pre-validation

  Since the entire batch fails on any validation error, validate all emails before sending:

  * Check required fields (from, to, subject, html/text)
  * Validate email formats
  * Ensure batch size is less than or equal to 100

  ### Minimal Example (Node.js)

  ```typescript theme={"theme":{"light":"github-light","dark":"vesper"}}
  import { Resend } from 'resend';

  const resend = new Resend('YOUR_RESEND_API_KEY');

  const { data, error } = await resend.batch.send(
    [
      {
        from: 'Acme <hello@example.com>',
        to: ['delivered@resend.dev'],
        subject: 'Order Shipped',
        html: '<p>Your order has shipped!</p>',
      },
      {
        from: 'Acme <hello@example.com>',
        to: ['delivered@resend.dev'],
        subject: 'Order Confirmed',
        html: '<p>Your order is confirmed!</p>',
      },
    ],
    { idempotencyKey: `batch-orders/${batchId}` },
  );

  if (error) {
    console.error('Batch failed:', error.message);
    return;
  }
  console.log(
    'Sent:',
    data.map((e) => e.id),
  );
  ```
</Prompt>

## OpenClaw Guide

Equipping your agent with its own email inbox can be a powerful tool to unlock new workflows. Alternatively, give it access to your Resend account to support agentic flows for sending and receiving emails.

<Card title="Email Automation for OpenClaw using Resend" icon="lobster" href="/openclaw-guide">
  View the OpenClaw guide.
</Card>

## Chat SDK

The `@resend/chat-sdk-adapter` package is a Vercel Chat SDK adapter that turns email into a two-way communication channel. Receive inbound emails through webhooks, reply through the Resend API, and let the adapter handle threading automatically. It also supports card emails, attachments, and proactive outreach.

<Card title="Chat SDK" icon="comments" href="/chat-sdk">
  Build conversational email experiences with the Chat SDK adapter.
</Card>

## AI Builder Guides

We offer guides to using Resend with popular AI builders to help you get started with AI agents.

* [Anything Integration](/anything-integration)
* [Lovable Integration](/lovable-integration)
* [v0 Integration](/v0-integration)
* [Bolt.new Integration](/bolt-new-integration)
* [Replit Integration](/replit-integration)
* [Base44 Integration](/base44-integration)
* [Leap.new Integration](/leap-new-integration)

## AI Integrations

Several AI tools have created integrations for working with Resend. Visit their documentation for information on integrating Resend with their tools.

<CardGroup>
  <Card title="Lovable" href="https://docs.lovable.dev/integrations/resend" icon={<LovableIcon />}>
    Tell the Lovable AI to send emails
  </Card>

  <Card title="Anything" href="https://www.createanything.com/docs/integrations/resend" icon={<AnythingIcon />}>
    Add email to your Anything projects
  </Card>

  <Card title="Wildcard" href="https://github.com/wild-card-ai/agents-json/blob/master/examples/resend.ipynb" icon={<WildcardIcon />}>
    Send natural language emails using Wildcard
  </Card>

  <Card title="mcp.run" href="https://www.mcp.run/nilslice/resend" icon={<McpRunIcon />}>
    Build email AI agents using mcp.run
  </Card>

  <Card title="Rocket" href="https://docs.rocket.new/integrations/resend" icon={<RocketIcon />}>
    Send emails from apps built with Rocket
  </Card>

  <Card title="Base44" href="https://docs.base44.com/Integrations/Resend-integration" icon={<Base44Icon />}>
    Add email to your Base44 apps
  </Card>

  <Card title="Leap.new" href="https://docs.leap.new/integrations/resend" icon={<LeapNewIcon />}>
    Add email to your Leap apps
  </Card>

  <Card title="Parsley" href="https://www.parsley.id/integrations/resend" icon={<ParsleyIcon />}>
    Send alerts and follow-ups with Parsley
  </Card>

  <Card title="Pica" href="https://www.picaos.com/integrations/resend" icon={<PicaIcon />}>
    Integrate Pica with Resend
  </Card>
</CardGroup>
