From 02bd15d61f44afa4e8c7e665cf164ce996a4a0f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Malfait?= Date: Tue, 10 Jun 2025 15:01:24 +0200 Subject: [PATCH] Website changes docs playground (#10413) From #10376 (extracting website related changes to deploy them separately, later) --------- Co-authored-by: oliver <8559757+oliverqx@users.noreply.github.com> --- .../images/docs/getting-started/api.png | Bin 0 -> 43778 bytes .../images/docs/getting-started/webhooks.png | Bin 0 -> 35790 bytes .../(public)/developers/graphql/core/page.tsx | 13 -- .../developers/graphql/metadata/page.tsx | 13 -- .../developers/rest-api/core/page.tsx | 33 --- .../developers/rest-api/metadata/page.tsx | 30 --- .../playground/graphql-playground.tsx | 71 ------ .../app/_components/playground/playground.tsx | 80 ------- .../playground/rest-api-wrapper.tsx | 33 --- .../app/_components/playground/token-form.css | 146 ------------ .../app/_components/playground/token-form.tsx | 212 ------------------ .../developers/api-and-webhooks/api.mdx | 47 ++++ .../developers/api-and-webhooks/webhooks.mdx | 80 +++++++ .../content/developers/constants/DocsIndex.ts | 13 +- .../graphql-apis/core-api-graphql.mdx | 5 - .../graphql-apis/metadata-api-graphql.mdx | 5 - .../developers/rest-apis/core-api-rest.mdx | 5 - .../rest-apis/metadata-api-rest.mdx | 5 - 18 files changed, 128 insertions(+), 663 deletions(-) create mode 100644 packages/twenty-website/public/images/docs/getting-started/api.png create mode 100644 packages/twenty-website/public/images/docs/getting-started/webhooks.png delete mode 100644 packages/twenty-website/src/app/(public)/developers/graphql/core/page.tsx delete mode 100644 packages/twenty-website/src/app/(public)/developers/graphql/metadata/page.tsx delete mode 100644 packages/twenty-website/src/app/(public)/developers/rest-api/core/page.tsx delete mode 100644 packages/twenty-website/src/app/(public)/developers/rest-api/metadata/page.tsx delete mode 100644 packages/twenty-website/src/app/_components/playground/graphql-playground.tsx delete mode 100644 packages/twenty-website/src/app/_components/playground/playground.tsx delete mode 100644 packages/twenty-website/src/app/_components/playground/rest-api-wrapper.tsx delete mode 100644 packages/twenty-website/src/app/_components/playground/token-form.css delete mode 100644 packages/twenty-website/src/app/_components/playground/token-form.tsx create mode 100644 packages/twenty-website/src/content/developers/api-and-webhooks/api.mdx create mode 100644 packages/twenty-website/src/content/developers/api-and-webhooks/webhooks.mdx delete mode 100644 packages/twenty-website/src/content/developers/graphql-apis/core-api-graphql.mdx delete mode 100644 packages/twenty-website/src/content/developers/graphql-apis/metadata-api-graphql.mdx delete mode 100644 packages/twenty-website/src/content/developers/rest-apis/core-api-rest.mdx delete mode 100644 packages/twenty-website/src/content/developers/rest-apis/metadata-api-rest.mdx diff --git a/packages/twenty-website/public/images/docs/getting-started/api.png b/packages/twenty-website/public/images/docs/getting-started/api.png new file mode 100644 index 0000000000000000000000000000000000000000..4176f14f1468ab80b494c36ff9878056fc6cbaab GIT binary patch literal 43778 zcmeFZ^;=h6w>=CEqiJbctu64jHC0HXx{4GRYDZ3qSl`WE014)6yI>_rMV*bCrqaM0&cApU+8 zDkbH`-+x2ofWDEZC@cdEj1Nro;|IBK;Cu5gzsa2?Zau`_N{Z-(fib}PnnC5GDq@7p zlNr+Zu>79)TbY>JtktR(tWqp>q)EY`*iEjxwbX?=D0i=?`ljs38)@K1I<=C#sf>ET zfAq^#st)==M+^yzDE2nFr+@Ax7pqqf2f033c>h(B!{+i={lTk2j>Vx}rzy^4=jP;M zrnQIu)|U{lgzjMf<3marpI>ic_Tm5Y1@{&Qa8$haF#pdNQX0VEkk`FKz+UlzfkXcH z2X{!Aq5t`I&<}e@$M;>}>MaS_|M*_ee%7nzxn9jwDoV+ z{TmDal7@dN+kax=U&aY&g?~xIzog+G$@u?&wPn~V%m?V*!bOYUs4yN{39%>-|>BK`|imf{U|7e1XJc`ON$R$j#kNc z7CFY|ZefZijgMJrqjz`8sCu(Bq}6$Z@1xqidtQzp{v(t%`ymtFKIm)PF`4~%)XFVW z2xDw`M&CC7G~L1A;0{SnU|mUy_N@6Gb0FjuMK{OJF<40!{Uejx1>GTqzhKqEg0{qc z9a5*M^ZZTyO3dW%04XcH@x{j4hFg^^TZ3zhSATyd789U^wS@)(ABWv3k}_>ACWA}2 zm&?)&tGmXX-?YE6b4VNJ+|^Cjf&L#ouLbCHlovPzA3#F9B*#62mDOZUhYFWTrNJ5crEs`6RQNUVwp7p` z6Zrq?`V}g^@5D_>UywlKBm{@By;;26jw9EdorIj5{S%eJf#|^Q``1ormj$N%o~0H8 zH0>5FgzmTqr$Z;Db5ZPV7lG6Q>TE7H7UF?zj(OgZe6>r55j;%CKgjA!jf zAGcCSm9T+K_pXy>c%eHnUdC0z&d~DuG#6W=ktDsb&25jD%cbe}X)cGNWFKu}1a?zO zc4l*J$KnFEiOEhr@65@~=>0|%3Mo$%P2*}&rhSP4>C90Y_umtuDdP_5E&49*EofDg zL{ju53kyVj^X7zl1P#aKi~O*skIAb<-qX1D*o+bEo3c;5Q7t3>^1b4^O0d+{UGnk2 zJ$f8iupvwIEz4+s_nD>FE4xalk}Pv2ZV%laqcdUhH%W-$8wmo$& zw=U=;oL?C|Q?$Rou!zsQYQgMWxwsfD@}^C1 zZ&AgEG0zukEYCku=_4?GLFn&hPji41QP;lfEZmsP5b+JvS3vKupYW1?zzd4IQ}3~1 zPTFHKW4$a$qf)@ZT`V?dpSxV}?OZ)%V|!@5O+jowu&OPht>+)XTi1w}Rj`Ai2nNSi zfA)V`M1b5J@G*GkG5P}P+zW)1@5;$>aV29K!pB}U8e87?av?}m1)DQbjJy?BG*Z8a zYc4>Q< zeDuZi`HC>LgL|T|z~L%4nGs_dYL&5@d^6`9*H$La@yj8wZgSBlZ_5{($dff}Rmo!Y z41ImFw;$P4?>`|=1PuD4`yY(Qh(CfjZgji}QUgv&^i>Z;T;xYp6&HyCm)zVz2t_05 zua2pz=~!J`m7&aCJ2ZtiJN2Kw7v1)70|#kVXLZ;NLx5qj#$NQ82O+;m-+aEN&FaHb zp4y`XP^ySn{0j&m@*v8f_O7$5M7G7s!GG}c)=ZyW@HV|mbJ4e7O4i^h*V{d`E|a<6 ziHCAiW4ZTgwg`5KcY&$LpT3Um8BowU{>2pUn$&`%@GCbH^L#Jx7w<0{w1r-XC|%w! zGU~3T5V}HdscHY7QcDaGwR%0>1iGH}Cm8V&<RL?`0`I04CnhGw$0H-RBRFsbB)+$X zRImE~;I~r{)0!0t(%#hWXmvL?;3WS69EPN{XVisE>tJF2bcF&v6aJtm7GcK?{%gPc~Ph^X0-{)trbKiC) z#>d4jpV}cY*$Uo#=M-*x&1s}wU|avC%uz5K-TOJu5pF}~w1(OUd~N~7k1gby@$K;q zKC8yT+Xkq;#f3P!a@GZ|>AQ3D1|AKA>#>CVY~AS3exD#OZ{HeM9bIt6tIG86l``hl z=fk?n-5d(NXC=kVl<)7RjgO=74cH4<8eX)$y8GZ+`t72z$m?NteDTnRUA8eXb&>V# z4evDDURV|Ix_Q2vDw*tATQj0mTi zrJQBl0UAvt-qcRfX<@tJyKJvJEjnG6p4<9(y?DnX59Jh~qp1n>!7Zh{cqZ5*$1bsUMA(wgl{H8nvhNppmqc!ijQ8dyMDQ*ZumO zkvyA_ct{;;C#yw#D#AdDubp%-u%AGWcy7p@AdEK!!wN@=hz(9+*0{7<4rXDL!b>L=cR+tJ%g$0bdc6l*30xc8rY<#3gJo zYGnN3M-k=?1w6});|cEPvx}SNS(q1Eh4ako9Zs^6U-Fl`$pqUK?Ks@W#Bd zeB)ruvI!jN!&poejazxeZj=sIS|YN1C#6zG8)uI1kHFxb2q`mJq->b|%?Ii+CoDrS zS}rZz;JfPeAs1J->FDd6466leG?Z9<(eo-V=lXMNTqr*2dfDqyRds&<{kEbnOGofa zSEuRcN}EQ9?)b1ce3av*>cB3^Z>|q811|D96a5=BL$nV^Z4wd$$oD?2#@THb`+fnq zz1EQyu9j}QygY7{Oal**6xiH6`fe?RWpt9hF*J5ugt3BV;>ZyO<|=}G4<{tr-pM0=%kv(aN^NqVgQ?rt9+ z$3LnAc)|loGxe^g?#|(dySRFZ;+HbH6nC40wl+5BIa_lR3m5a|>-SsruY;5KaI1Lo z+o`r$Lqpr8rcbHn%qBHIsXv}g0H?Si(_$73gWY{0K3X>j6>iv%%8u~g!bm{ z41EV$q>rFQB6YJ4b~a?@u;jbOK|EEv(9c~|RkFCs4DFM2{tNE86ob2Z^=7fWJRGzA zjdpVyZhdzP-ghoM^UT8E@P!51QgieMwd`veZ1#IICvUIivhfpjt#SIEh`8m?L7?qmA$xiwD{j))tHEF?3ES#j4T>isc7Z; zb$y$9@!78V4!3v+GmeL4bH{KxGo0wcUm}Thfwn75n8(y?JGd|1=4`CL>mcb>5~H@b zz_e%Q`)HGrvRw_<=twneOjX*aSO$ZD!z64C{qr^jRC99=gJ3WLH^$3$-i=}wzG9g^ z)=I(mJ`xUFD=-PJ+q#z}?ze=^Em&2uGj?T6DRe6`z3JQRN85N67|B~J%&H^`jiL4N zQ7N>XgAPA$JERY=$n6@0Gc=m%`yOlTIvSA{y~Hy^Gi7(M)_8pwo5c;~Qs;}6q(OR8 zL{;~-L&oYCMoEF}O42-=u@b!cucu)#7M`?9N&={Y=@ozsiXLCIOVd?fVb}8vw0W%f z&k<_J&~BA zm1G^7c5D9W(2^uJ6896C8AgZCt9$t9$e*%f+Z~O}rZ!{x2Zi zAJZE>D3^SH;{YiM$SwfDp?giISk6&8NpTBA`Y?Dy6Wnv6+x} zzl?&_@WgH5r0IwtnM-yg;d3@5)yBnwddYgL|Htw3(qM~E>(k+7m9}SUoqf&?3qgrP zhduW7dINQ2E43>$&v>b%z_)s#7PU|HMgSDXfCd*e{U|RfryxX~!(3Tv{B!mD8}5e0 zR)F>Nl=%ac8z%^<*;zA(Ph0lkPBM}ENK~^U>{qM)kS!$ZzS)r-)Y{O2MpafOhxsMK z#S-+f$~^1-8y93@bF@xo#tsZq}iWe`Lntk$z)40$U8ouyoJ zY2Bjc4(J#mV9G@^)1!$OFFl@1IK3#b47DE$IqV!!QwXj&v2_Ns+|bj#_A9%nd=8W zJjH96tUD=X568hr5R`4f$Ml>1@K-KsD7QG5S1z0Scwr@-6vB^MCh14QMY6tZ!M=WR z)hP}Kt)Wil**)@N$k1(ij9R&JdG{sM_tcj>+Y%C%>TI*NeYZ!^FO@sBj#$x|PMAhy z-A>dO%@=kfMQM+-4>T3;O4Wt^${X84lS1tV6s;fj@)|}~KKa_y|Lj;T>sD%*97BOU zY@wp-##fnP3Pu|53jZ?nLPdxG2}2pwlbU(%*}AMN8xV z;n!>0&XnS^*6dFMK1OGLr&4tntB2?f_GLHwi{JjsZ9uz%8sB`WoE?~*`7qF?R@^jx zKUjLeM^Cy|L#WR{UAdP)w4GX(8w)UMHCIs~F|nnGhQ(a5Jyf-{&XpDavZQ;Bg|GUE zrIo!Ul7vW48cd`H@Bn_i1b+hpsRANGc|kUlIjuR|*qYMaBT)uA5r(FkR^`}+lKsr{ zxXDInQ=-qJxj$#J$yJ@Hlw*_24mGng%ymqINZ5(^v6fXu?L;ouClfTlNs5KPvEaIW z5&C*nH_FJ>$u4At*U6J02#R(-!es!oQF$P3Ku;w<_<$_Get{%wuyj;U9x&aGB!MRB z?{;UMEF8HJBFK!=Aul}0S`)wvxLV-gq zJs4#xJb`)kXZBMc0n%!SZ<=ndu8o|qpw+HMMWrv(q>(}uaopiXprU<+a$ zczc4Gq-+~1*fcIKByfyFw|61d5%Pf{a9bQaw}~P6QlfSQye1Or2}r z2)c29OT-{?Bki`qDu(#7uViT!S=t|Tix5j=&wG9gVF=JTtjVs1;h8C_@Aq-_^%i}C ze)XL0_}&5u03HcL4YZI#f-NW&}*V4==#r(%hP(Yidy;M35Ovv ze|^lLQ=b4bH~<}C0pdCDAZHriSZ^+xl(6frhy4P)DIv>_b{3YCK<2r6pLuze|K)0M znHsz*tqjd2eK;Md{Wd-mlFM9VsXEixj7c?4ztpNX?CoIguhyB2tL}Nosn&~|l>bc1uL5vt|IvVPYd>K6keAm(lb*HQ35u@_iXb36ivS%pJCUr znvUkPo3XI(!i7tw=53-#%J3xeyu#|R0%iEkraR#g-qeAH>=VSkFFjRXI#JS$yKR&Q zY0_iS5v&)5M@L7;#u|bN2DO2C%RXh=fK2z!k8`CB+!v1yt%#318U{YDSZA5gnLqn7R=*rlh1~XX}4a zcz|{JRn5d&p&1_(6f`C$tP*DyBoO5|f5g_Os}TwK@_HhMAaDh#<#dveI=g{h={n}< zN7O0FYN>itkMFiZfOt*jFZ*jT5NSr~cI?dBD&t4{QTQgN8J3MahK-KCzMekhsLY$m z0lRrdx7+n-J;92LGjE92-!RFiSy}8zGZje)3AX|&j*gD)T`Y^e5rIzTbl>ieM8%s{ zqXgf@VoQIz_}!4w+M4#OVp>smUVXi;k&^B`H(*z>8StJ)keHFs>Wf`h>efy^IGBBW z5zeEBNHeQC$ zs0jr=&8mBFtJbP=qGIqtwHu=a!^ouB8v8r(l zU!W2>mayDPv~?*_q5pC!U1DHYO@@7fuRcSE@q``G`Psy3F#!C1EYq(=!N5qB#5Fe( zuApbLL^RlnDRFMk##I`Fo7fmV1)|ar>%Ry#Rg0^TSM6(OE_I~cNFq_&GHk5^9)_=k z>BmzE#y5a(+ECOq`YlPkJ$ud6R(`>cbX9v5$C2e{5Ta^FRl%O$OtihIJo3-)Y57ml zIR&t5Z&R-@J`mz8LuH(HdIhQ?&h(rH64QOr`pq{i+vZ9aS)*h2bB#T%@W_y{{%s|z zjyR6-pg)}CR!A+}08O1ZJ#&{@UWHh%&`Ct#OIi*4EWPFf$aioJY0g3Yt0kpism~l- z891X+Z*Vw4h}o|EjF^{ctnp0@>`J+14u^H4owDd@1C{_idGC4wNoo|=eQ|CuipO{& zn1oGXz!@`hUhF+!DF--M8xp+LjW58Tgoh>zxL<&Z>BlWlBPP8HME>Nh%j(fP2(KqpM%gg@K~odFx<}ac%3IO=nb%G4a!Ow z%jmOPg;BqW=@p9*b$+s(@c7*ODwWf}u5398H?zgu0v(1z&`H8U^uFQguLw5- znOONOt1Xr#_NOBR8{h@7gJG%lIAEE9YSIoaa^d}Sc;~!|6vOAp;+0O1twh_+tX{>@ znl*Nk`nR@hIuAS-V#4V(nwRPkErl{G-!b;nA~Ps?C}llJdUS8GL>Q1aEZf(m z*NC1XB?bk^*FwImpb5=Dus9h-FJ6RLBFaFO+l}h1vQ}{zZ{%+;;R%c97w6W}v5YG( ziP2Dga;uuCU*<^P=g&8{F?B8JX8p2kYJeDZju<3YOey^1YpSX?N{E#yi88BOY_^1( zljij2^??^o;^JZJ8WT(89+OW$JfIOwT&{B=feW6?K&wsH+=^ZCy>OL>JxtiF{#dx_@VWmvu4S_y$_woi&?X0R^i;${dAq z(A#zKN1<<<{}~Yyy{LEDh7(#5e}4}dk(Ihzvfe~&qDA-@ot#N{+{z!j^Si@Np4=J~ zl+Tx@8p*|G54bYc%v4OW<=`-X4c;J#9+{WaK{{VR$*a3Cvt{#jJ0wz2X0l`J7XWW{OwkS%-uY5Ho4 zWPH~QQ67h#$S?>v|CIF$antmITN^Z{QIz<{N1F6&`4R>8k?9+b*_i|LeicP@;Ddys2+5xvVLJZML?%fJy3JKLUj2f zYHs9rQa4?sx)I!bJJL-`*>oRLXNs4)w3c={h#%N4ap}Qve89jeKYUZ&_Us|7kZKyG z88(=8+CEtdN_@TkRZc?>@bj1YAJ*Adq0f1!PS{CW{(N~cAmZdQh^B8Q7I!eIcr^xq zYfs2L?9C6w0=fR~8NeXceB(!!h&OjWQae-4>Dts_!T%xduginuKxA(=Q^=MxzoGcB zd{fOi?`8)03=|JDmAbl$J0C3ZKqMYSK;N~{QW8V1t%6QdCRCKO+Z9ly_S)APrEAjC z8*VL`l&)(%w$(=jxPK~*YQn=M_v?V!spEnI0p*9eO_t(a*L(sW6?6MY59sr6mZNvs zI6>!I9WpYESA{Q}bdAv)q49(t6$6+@C{Xak^2JXEN*zhk z7kQbSx{S{G#mr$-0>#Y@gt#wL`iDbu@$}9^BL^IH^7@vBX7(xxMb=R~m1)q|tpUTr zusjD2=4mGWuvi0Cl_Hqi&>-OBGl7tq`P~oGN83j~+JA1UgDei@R_!S&MV`q1X(R`F zkm9AlXTmM$KA_C6u9~@2hUXQ8K1p5ESog~ID!wt+CgOk8^?aJA00j+5qEQ4@c2KEH z%pY*|9AC95Ix`lSoXf@Vkm9%AePgMDt7W>DL2 z|9snz?{t{nc=CudAcyw|d-_{E%5va^Uhu%082v&4cB6$10_iX&zLkMxlnlI!81c%E zl8N!t2D^@BuOHWb!xE8-w6X`$;=cE|vB{3A%>xDQCOf5`4(_HSh-8*;%2hN}JTEo4 zHjv<+wVE8d!G#?&YZCpa(^ZsNmhy20+ynH2W@Iba&kTNO^%Ej$!r6nko>!u_GCh_e zS#3pTVY>`d3Eit4q&IA{EOskT^?X8Uh+N~zf=^?OwV>LJd&?Fa9*0%IMu!U1q~zc} zZ-A~J{OFpbnoINtrfH7#4ToB2q_Fb{E;ji*E0Nj(;=>CZ!f#xjTyD#e+xRd1GXT*b zENPR>xq7$*myy9C2ctj zD)C7Pr4$_mvMutko7k_{uO}{AzMQ3o!~M~0%Z4|)a4ehExThqW5WD<|A3OZ51~0j= zUTcFx&1_AhPH4hs?}F|B+ZR$sNtVx-Q1Fsn$#cmsAHwv5CAmExs7CJ1qRb@ie=)MQ zO!$;mr2(qs6BqCj#8SmzO%{&#U;y`hcHEE@8|VS}8c(YK;>vD^W4^dHUFdhCkZa{QJn>0BY6zTgUhP`Mm+GMBwNH`5b4$hOJQ4hjyHU0I+e zYGsNcrvvkXhnqk-2V`zGmj82hb0A|{QP431K^UqFsZemu#pDvn2!67$7GoG&VXBk+ zbIdn{16D?bU(eL!mOxO4EzJ?DU80@m&t+WP9W;T-`|bKmq8_75S=oetXt~f}=+R$V zo;Q*8F#kGi^|$(Oo3(ju0Hr?1U!%Xkd$vv8-Lb*-yB}g>?J6E8DkZ|_O7q@&(3$B? z)Bv?^Jq#0#p=S#$lulfySE6YrCWQ@@n}zJb-!2cdT8p;LmyLh@m=G0HfW4fpHGezP zvadg0cwZ8&h3ClgJlmEGz)=mCVg{XmIn*3;_6ma|R3>h+N7iwKN*}%&Qub!3psw51 zKf9{Y#_ViDfm<|}RpsXR^M6(hoC#uVi9Y=!E^xB>7(DFEy?gNc%m~R;M-V+i5xQ;O z<_;M-Cjz!0#=Ki^4Q=ibdVzyN)gVoBXyGKAsF>MesrVsv*WdbB05BpZvB#;Sz5c_T zEK|^B!)6G%=5#;UMTRZ;J0#KABzASGEU%mJ58%5oJ6%S{Ge4lhqJh9s6Agr55R}m% zgB6uV(-m4c&8hb;T$&FfwR?gRTH_2#&K|u>o6$?Gvc!{r z{BPpx2Q|C=T@CQ!Z5%v5C?R`O62ehz9ei)gpmaSq?>j5JcttgxS1btfCZ_?f;U8f} z2?6VFL#N>8*WDuutdLj?=GVW~O*m-LedXiH$KLgJoi$GN`iz#G1KHkehtF^%Nyd_fQ(V)Jh!``h9HPs?98VG4ake`wkeC_>Q1I9wgC{imQse#geT0 zYm|{cBWuf)_-etnOH3h29Nv<0?CjJdR!MLis~3-M=fs50PrvzgUpbL!%g4Y z_Q7>VSGJ7kU4#K~J*H@b@WNr>mh)xd?J5mbz17TEu|d*5O*>nF0u+?=dd#@LAk_6N z-o1AeowQ{#mY?9Atoo`yTN~7pHBYlp#Mh_%09e8Y+`n1T#3NbDw2NB#Bc0rCUuAyx zMy3^hLPdH|QFgBlR1M%0^*BFA4!<)yM2s;JWr7rvY|#l?T|5_ch}EpYomQscP{w({ zevRk_3^KmEn;)H9rpL@=sz&fXfyO7xx7v)zJZt&bTLzS6p?4unu!|W#WJ*Y7(EeVgSoLa_5TxA>WlJs6csq4r_rh;2R zK2wcTNMCLtQ2L>Lqh+}vx-Sy)H2>0u@tJ#rypOWLO z0r8vKXt$X)?By7{k6Vi)7fsLfcDyRjT+Vfo?YO6h*|Qf zJC0AyBi4E&o|;j`MSEcb#&)wOpDM+92*Jz>jh2%@u)+y z_KX^y8w@CqS3BmL;q3Yf6Vw@Rzk&ZLp!jqaMN$9(fa)_;2t0bUBYfj(&M^qNEc*RI z!lOZ~YfT>c0x6E%)IqB1%;EOH7dq8JnzTUT^u%$f#3Dxkb`!5Da4kl=SWs9 z^5Sw{NM1xIs;hDL^DMM>Umj7TQVwh0KgaFAXa!KJitf{8^x7D84W}`T(gYW^M!Wkh z-7pu5cP6Z>-Ubj$=#3j>yPnQcXe2aFQhzhV@0l|>`~sp+Ge!k<@s-}sy#cmSq{KZt zled+7>0BBvAl|{1Qh4}f*ju2Ak z54<{Vb6uxY!QHNfp}waWT=p=hDCtD#YV`~5QM{`Y^?tsWZyaDuC$W^1gz zXLjTc(11%MjvFTxyh~oSi=`<}cR)dY*7)WgW0l4VGhF;>pbQZvm2!0H3-p`CB08VT zPnVhh?CE62CHB~(!aLTVN{+zurdAP6UfMcg|32Tws#y9#!OQyVdQIImZR7Wvve&LFn_}d-pce~7 z4efyJ|21sz;z`vLt-|S+gh%x}8)K(UtZC&d_EG;AmBN?E&FK8g_bBA@Zd@Splxekg zr{2hi6Ldx$7ag6rjtD70;5-r^x6)u%wHtM{O4rP6t252I*uZ)i))PCB>>8Tx z3tM$`dE<{kVMk@*gDWg<08$NMun|!oEB)cc<@V0Lh};dQ5hT$q z51;3yKluN|J@=7fl{b7pJ!v85gyNmS3ncEHvj>i=30!z`w2Uj~)NNVoqNFHpW;=Vc zxX9Uv&%F)S1BL^2d5pdSRRQx2+nWNOD}P}M1X5Ck2ZfLWN-Qn5{VfYlxNOh8^lTA*R|%AGCRW#Z^k6Pe zSsBGA0FG+OmuqxTy?4Mz+@8*skN{BXHpsD(0KMS|LQyhU3tCuPR%6BK(@P;y!UiqD zD&}7^!``&njXqk{T#; z_lx0JqelJElD}#7$uCkr%b}0yV6H_nfDo24x?$l!86@6N0Ec=zO_; zYl=n22i2gSd^wHMl|c!RA#tT@&Ypqgz0;u^KyGQ`bnehN^>>C=@E{h!$U#hQ1T0v~ z0)$!hZY&K~e-|)MJ&j1+CT<#GMLt%CNZ#~|@UT@Zw$bH0n@iO<_ff$1<*3)@(9hA3?0JzNV_`MNx1R+(M!%0I!Y8OWsmdEgCiy!G>%)$%FTqES{*YAT; z%;E?cAT|ytl{s<=N5}RiO%C=E?QCH3D6NPG?d)KZ+zM^CXI^S>{GOOt&r zcn5;DiMnm*2Zo^e8_x4LdwzWElPFUa^&PY51{}MKcYPC$Ff&9r-Kx743_0!6iuNh< zHmKGH0nd(3iyo+9gf-;{s7~NaLGR*-W{j7C=)D7l&=ioM$N>9JHAbM<;(hrJk*Ck0 znmuQlm)T?KLRwxCBYVxDP_pzhuBRAY*!)xzAXoRE+jj|bA(hg?0$oxF&%hA5_c?Uxjf(kj%G+kVHdd%b^hJ3eppFvNAAEc#} zQN1L(pHQzqfoXA-LzibNOT)QCb5Y`CGId=93LeCgaJB`7?yss;goPUcmbRvd<4N^R z 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¨# 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 literal 0 HcmV?d00001 diff --git a/packages/twenty-website/public/images/docs/getting-started/webhooks.png b/packages/twenty-website/public/images/docs/getting-started/webhooks.png new file mode 100644 index 0000000000000000000000000000000000000000..997ce2a0ada331beea66b35e2b0c1d369c8456fc GIT binary patch literal 35790 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 H?O*=|V$6DZ literal 0 HcmV?d00001 diff --git a/packages/twenty-website/src/app/(public)/developers/graphql/core/page.tsx b/packages/twenty-website/src/app/(public)/developers/graphql/core/page.tsx deleted file mode 100644 index a83cdf389..000000000 --- a/packages/twenty-website/src/app/(public)/developers/graphql/core/page.tsx +++ /dev/null @@ -1,13 +0,0 @@ -'use client'; -import dynamic from 'next/dynamic'; - -const GraphQlPlayground = dynamic( - () => import('@/app/_components/playground/graphql-playground'), - { ssr: false }, -); - -const CoreGraphql = () => { - return ; -}; - -export default CoreGraphql; diff --git a/packages/twenty-website/src/app/(public)/developers/graphql/metadata/page.tsx b/packages/twenty-website/src/app/(public)/developers/graphql/metadata/page.tsx deleted file mode 100644 index dd2c6521f..000000000 --- a/packages/twenty-website/src/app/(public)/developers/graphql/metadata/page.tsx +++ /dev/null @@ -1,13 +0,0 @@ -'use client'; -import dynamic from 'next/dynamic'; - -const GraphQlPlayground = dynamic( - () => import('@/app/_components/playground/graphql-playground'), - { ssr: false }, -); - -const MetadataGraphql = () => { - return ; -}; - -export default MetadataGraphql; diff --git a/packages/twenty-website/src/app/(public)/developers/rest-api/core/page.tsx b/packages/twenty-website/src/app/(public)/developers/rest-api/core/page.tsx deleted file mode 100644 index 4c211c3ec..000000000 --- a/packages/twenty-website/src/app/(public)/developers/rest-api/core/page.tsx +++ /dev/null @@ -1,33 +0,0 @@ -'use client'; - -import { useEffect, useState } from 'react'; - -import Playground from '@/app/_components/playground/playground'; -import { RestApiWrapper } from '@/app/_components/playground/rest-api-wrapper'; - -const RestApi = () => { - const [openApiJson, setOpenApiJson] = useState({}); - const [isClient, setIsClient] = useState(false); - - useEffect(() => { - setIsClient(true); - }, []); - - if (!isClient) { - return null; - } - - const children = ; - - return ( -
- -
- ); -}; - -export default RestApi; diff --git a/packages/twenty-website/src/app/(public)/developers/rest-api/metadata/page.tsx b/packages/twenty-website/src/app/(public)/developers/rest-api/metadata/page.tsx deleted file mode 100644 index e76cadc93..000000000 --- a/packages/twenty-website/src/app/(public)/developers/rest-api/metadata/page.tsx +++ /dev/null @@ -1,30 +0,0 @@ -'use client'; -import React, { useEffect, useState } from 'react'; - -import Playground from '@/app/_components/playground/playground'; -import { RestApiWrapper } from '@/app/_components/playground/rest-api-wrapper'; - -const restApi = () => { - const [openApiJson, setOpenApiJson] = useState({}); - const [isClient, setIsClient] = useState(false); - - useEffect(() => { - setIsClient(true); - }, []); - - if (!isClient) { - return null; - } - - const children = ; - - return ( - - ); -}; - -export default restApi; diff --git a/packages/twenty-website/src/app/_components/playground/graphql-playground.tsx b/packages/twenty-website/src/app/_components/playground/graphql-playground.tsx deleted file mode 100644 index 3f2a3e12e..000000000 --- a/packages/twenty-website/src/app/_components/playground/graphql-playground.tsx +++ /dev/null @@ -1,71 +0,0 @@ -'use client'; -import React, { useState } from 'react'; -import styled from '@emotion/styled'; -import { explorerPlugin } from '@graphiql/plugin-explorer'; -import { createGraphiQLFetcher } from '@graphiql/toolkit'; -import { GraphiQL } from 'graphiql'; - -import { SubDoc } from '@/app/_components/playground/token-form'; - -import Playground from './playground'; - -import 'graphiql/graphiql.css'; -import '@graphiql/plugin-explorer/dist/style.css'; - -const StyledContainer = styled.div` - height: 100%; -`; - -const SubDocToPath = { - core: 'graphql', - metadata: 'metadata', -}; - -const GraphQlComponent = ({ token, baseUrl, path }: any) => { - const explorer = explorerPlugin({ - showAttribution: true, - }); - - const fetcher = createGraphiQLFetcher({ - url: baseUrl + '/' + path, - }); - - if (!baseUrl || !token) { - return <>; - } - - return ( - - - - ); -}; - -const GraphQlPlayground = ({ subDoc }: { subDoc: SubDoc }) => { - const [token, setToken] = useState(); - const [baseUrl, setBaseUrl] = useState(); - - const children = ( - - ); - - return ( -
- -
- ); -}; -export default GraphQlPlayground; diff --git a/packages/twenty-website/src/app/_components/playground/playground.tsx b/packages/twenty-website/src/app/_components/playground/playground.tsx deleted file mode 100644 index 5ce774490..000000000 --- a/packages/twenty-website/src/app/_components/playground/playground.tsx +++ /dev/null @@ -1,80 +0,0 @@ -'use client'; -import React, { useState } from 'react'; -import { TbLoader2 } from 'react-icons/tb'; - -import TokenForm, { TokenFormProps } from './token-form'; - -const Playground = ({ - children, - setOpenApiJson, - setToken, - setBaseUrl, - subDoc, -}: Partial & - Omit< - TokenFormProps, - 'isTokenValid' | 'setIsTokenValid' | 'setLoadingState' - >) => { - const [isTokenValid, setIsTokenValid] = useState(false); - const [isLoading, setIsLoading] = useState(false); - return ( -
- ); -}; - -export default Playground; diff --git a/packages/twenty-website/src/app/_components/playground/rest-api-wrapper.tsx b/packages/twenty-website/src/app/_components/playground/rest-api-wrapper.tsx deleted file mode 100644 index 390fd0cf6..000000000 --- a/packages/twenty-website/src/app/_components/playground/rest-api-wrapper.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React, { useEffect } from 'react'; -// @ts-expect-error Migration loader as text not passing warnings -import { API } from '@stoplight/elements'; - -// @ts-expect-error Migration loader as text not passing warnings -import spotlightTheme from '!css-loader!@stoplight/elements/styles.min.css'; - -export const RestApiWrapper = ({ openApiJson }: { openApiJson: any }) => { - // We load spotlightTheme style using useEffect as it breaks remaining docs style - useEffect(() => { - const styleElement = document.createElement('style'); - styleElement.innerHTML = spotlightTheme.toString(); - document.head.append(styleElement); - - return () => styleElement.remove(); - }, []); - - return ( -
- -
- ); -}; diff --git a/packages/twenty-website/src/app/_components/playground/token-form.css b/packages/twenty-website/src/app/_components/playground/token-form.css deleted file mode 100644 index 623df47fd..000000000 --- a/packages/twenty-website/src/app/_components/playground/token-form.css +++ /dev/null @@ -1,146 +0,0 @@ -.form-container { - height: 45px; - overflow: hidden; - border-bottom: 1px solid var(--ifm-color-secondary-light); - position: sticky; - top: var(--ifm-navbar-height) + 10; - padding: 0px 8px; - background: var(--ifm-color-secondary-contrast-background); - z-index: 2; - display: flex; -} - -.form { - display: flex; - height: 45px; - gap: 10px; - width: 50%; - margin-left: auto; - flex: 0.7; -} - -.link { - color: white; - text-decoration: underline; - position: relative; - font-weight: bold; - transition: color 0.3s ease; - - &:hover { - color: #ddd; - } -} - -.input { - padding: 6px; - margin: 5px 0 5px 0; - max-width: 460px; - width: 100%; - box-sizing: border-box; - background-color: #f3f3f3; - border: 1px solid #ddd; - border-radius: 4px; - padding-left:30px; - height: 32px; -} - -.input[disabled] { - color: rgb(153, 153, 153) -} - -[data-theme='dark'] .input { - background-color: #16233f; -} - -.inputWrapper { - display: flex; - align-items: center; - flex: 1; - position: relative; -} - -.inputIcon { - display: flex; - align-items: center; - position: absolute; - top: 0; - height: 100%; - padding: 5px; - color: #B3B3B3; -} - -[data-theme='dark'] .inputIcon { - color: white; -} - -.select { - padding: 6px; - margin: 5px 0 5px 0; - max-width: 460px; - width: 100%; - box-sizing: border-box; - background-color: #f3f3f3; - border: 1px solid #ddd; - border-radius: 4px; - height: 32px; - flex: 1; -} - -[data-theme='dark'] .select { - background-color: #16233f; -} - - -.invalid { - border: 1px solid #f83e3e; -} - -.token-invalid { - color: #f83e3e; - font-size: 12px; -} - -.not-visible { - visibility: hidden; -} - -.loader { - color: #16233f; - font-size: 2rem; - animation: animate 2s infinite; -} - -[data-theme='dark'] .loader { - color: #a3c0f8; -} - -@keyframes animate { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(720deg); - } -} - -.loader-container { - display: flex; - justify-content: center; - align-items: center; - height: 50px; -} - - -.backButton { - position: absolute; - display: flex; - left: 8px; - height: 100%; - align-items: center; - cursor: pointer; - color: #999999; - - &:hover { - color: #16233f; - } -} \ No newline at end of file diff --git a/packages/twenty-website/src/app/_components/playground/token-form.tsx b/packages/twenty-website/src/app/_components/playground/token-form.tsx deleted file mode 100644 index 2529446c4..000000000 --- a/packages/twenty-website/src/app/_components/playground/token-form.tsx +++ /dev/null @@ -1,212 +0,0 @@ -'use client'; - -import { usePathname, useRouter } from 'next/navigation'; -import React, { useEffect, useState } from 'react'; -import { TbApi, TbChevronLeft, TbLink } from 'react-icons/tb'; - -// @ts-expect-error Migration loader as text not passing warnings -import tokenForm from '!css-loader!./token-form.css'; - -export type SubDoc = 'core' | 'metadata'; -export type TokenFormProps = { - setOpenApiJson?: (json: object) => void; - setToken?: (token: string) => void; - setBaseUrl?: (baseUrl: string) => void; - isTokenValid?: boolean; - setIsTokenValid?: (arg: boolean) => void; - setLoadingState?: (arg: boolean) => void; - subDoc?: SubDoc; -}; - -const TokenForm = ({ - setOpenApiJson, - setToken, - setBaseUrl: submitBaseUrl, - isTokenValid, - setIsTokenValid, - subDoc, - setLoadingState, -}: TokenFormProps) => { - const router = useRouter(); - - const pathname = usePathname(); - - const [isLoading, setIsLoading] = useState(false); - const [locationSetting, setLocationSetting] = useState( - (typeof window !== 'undefined' && - window.localStorage.getItem('baseUrl') && - JSON.parse(window.localStorage.getItem('baseUrl') ?? '') - ?.locationSetting) ?? - 'production', - ); - const [baseUrl, setBaseUrl] = useState( - (typeof window !== 'undefined' && - window.localStorage.getItem('baseUrl') && - JSON.parse(window.localStorage.getItem('baseUrl') ?? '')?.baseUrl) ?? - 'https://api.twenty.com', - ); - - const tokenLocal = ( - typeof window !== 'undefined' - ? window?.localStorage?.getItem?.('TryIt_securitySchemeValues') - : '{}' - ) as string; - - const token = JSON.parse(tokenLocal)?.bearerAuth ?? ''; - - const updateLoading = (loading = false) => { - setIsLoading(loading); - setLoadingState?.(!!loading); - }; - - const updateToken = async (event: React.ChangeEvent) => { - window.localStorage.setItem( - 'TryIt_securitySchemeValues', - JSON.stringify({ bearerAuth: event.target.value }), - ); - await submitToken(event.target.value); - }; - - const updateBaseUrl = (baseUrl: string, locationSetting: string) => { - let url: string; - if (locationSetting === 'production') { - url = 'https://api.twenty.com'; - } else if (locationSetting === 'next') { - url = 'https://api.twenty-next.com'; - } else if (locationSetting === 'localhost') { - url = 'http://localhost:3000'; - } else { - url = baseUrl; - } - - setBaseUrl(url); - setLocationSetting(locationSetting); - submitBaseUrl?.(url); - window.localStorage.setItem( - 'baseUrl', - JSON.stringify({ baseUrl: url, locationSetting }), - ); - }; - - const validateToken = (openApiJson: any) => { - setIsTokenValid?.(!!openApiJson.tags); - }; - - const getJson = async (token: string) => { - updateLoading(true); - - return await fetch(baseUrl + '/open-api/' + (subDoc ?? 'core'), { - headers: { Authorization: `Bearer ${token}` }, - }) - .then((res) => res.json()) - .then((result) => { - validateToken(result); - updateLoading(false); - - return result; - }) - .catch(() => { - updateLoading(false); - setIsTokenValid?.(false); - }); - }; - - const submitToken = async (token: any) => { - if (isLoading) return; - - const json = await getJson(token); - - setToken && setToken(token); - - setOpenApiJson && setOpenApiJson(json); - }; - - useEffect(() => { - (async () => { - updateBaseUrl(baseUrl, locationSetting); - await submitToken(token); - })(); - }, []); - - // We load playground style using useEffect as it breaks remaining docs style - useEffect(() => { - const styleElement = document.createElement('style'); - styleElement.innerHTML = tokenForm.toString(); - document.head.append(styleElement); - - return () => styleElement.remove(); - }, []); - - return ( -
-
-
router.back()}> - - Back -
-
- -
-
-
- -
- - updateBaseUrl(event.target.value, locationSetting) - } - onBlur={() => submitToken(token)} - /> -
-
-
- -
- -
-
- -
-
-
- ); -}; - -export default TokenForm; diff --git a/packages/twenty-website/src/content/developers/api-and-webhooks/api.mdx b/packages/twenty-website/src/content/developers/api-and-webhooks/api.mdx new file mode 100644 index 000000000..5da6b5aab --- /dev/null +++ b/packages/twenty-website/src/content/developers/api-and-webhooks/api.mdx @@ -0,0 +1,47 @@ +--- +title: API +icon: IconApi +image: /images/docs/getting-started/api.png +info: Discover how to use our APIs. +--- + +## Overview +The Twenty API allows developers to interact programmatically with the Twenty CRM platform. Using the API, you can integrate Twenty with other systems, automate data synchronization, and build custom solutions around your customer data. The API provides endpoints to **create, read, update, and delete** core CRM objects (such as people and companies) as well as access metadata configuration. + +**API Playground:** You can now access the API Playground within the app's settings. To try out API calls in real-time, log in to your Twenty workspace and navigate to **Settings > API & Webhooks** (under **Developers**). This will open the in-app API Playground and settings for API keys. _(If you don’t see the API & Webhooks section in Settings, enable “Advanced mode” in your app settings to reveal developer options.)_ +**[Go to API Settings](https://app.twenty.com/settings)** + +## Authentication +Twenty’s API uses API keys for authentication. Every request to protected endpoints must include an API key in the header. + +* **API Keys:** You can generate a new API key from your Twenty app’s **API settings** page. Each API key is a secret token that grants access to your CRM data, so keep it safe. If a key is compromised, revoke it from the settings and generate a new one. +* **Auth Header:** Once you have an API key, include it in the `Authorization` header of your HTTP requests. Use the Bearer token scheme. For example: + ``` + Authorization: Bearer YOUR_API_KEY + ``` + + Replace `YOUR_API_KEY` with the key you obtained. This header must be present on **all API requests**. If the token is missing or invalid, the API will respond with an authentication error (HTTP 401 Unauthorized). + +## API Endpoints +All resources can be accessed and via REST or GraphQL. + +* **Cloud:** `https://api.twenty.com/` or your custom domain / sub-domain +* **Self-Hosted Instances:** If you are running Twenty on your own server, use your own domain in place of `api.twenty.com` (for example, `https:///rest/`). + +Endpoints are grouped into two categories: **Core API** and **Metadata API**. The **Core API** deals with primary CRM data (e.g. people, companies, notes, tasks), while the **Metadata API** covers configuration data (like custom fields or object definitions). Most integrations will primarily use the Core API. + +### Core API +Accessed on `/rest/` or `/graphql/`. +The **Core API** serves as a unified interface for managing core CRM entities (people, companies, notes, tasks) and their relationships, offering **both REST and GraphQL** interaction models. + +### Metadata API +Accessed on `/rest/metadata/` or `/metadata/`. +The Metadata API endpoints allow you to retrieve information about your schema and settings. For instance, you can fetch definitions of custom fields, object schemas, etc. + +* **Example Endpoints:** + + * `GET /rest/metadata/objects` – List all object types and their metadata (fields, relationships). + * `GET /rest/metadata/objects/{objectName}` – Get metadata for a specific object (e.g., `people`, `companies`). + * `GET /rest/metadata/picklists` – Retrieve picklist (dropdown) field options defined in the CRM. + +Typically, the metadata endpoints are used to understand the structure of data (for dynamic integrations or form-building) rather than to manage actual records. They are read-only in most cases. Authentication is required for these as well (use your API key). \ No newline at end of file diff --git a/packages/twenty-website/src/content/developers/api-and-webhooks/webhooks.mdx b/packages/twenty-website/src/content/developers/api-and-webhooks/webhooks.mdx new file mode 100644 index 000000000..76895c807 --- /dev/null +++ b/packages/twenty-website/src/content/developers/api-and-webhooks/webhooks.mdx @@ -0,0 +1,80 @@ +--- +title: Webhooks +icon: IconApi +image: /images/docs/getting-started/webhooks.png +info: Discover how to use our Webhooks. +--- + +## Overview +Webhooks in Twenty complement the API by enabling **real-time notifications** to your own applications when certain events happen in your CRM. Instead of continuously polling the API for changes, you can set up webhooks to have Twenty **push** data to your system whenever specific events occur (for example, when a new record is created or an existing record is updated). This helps keep external systems in sync with Twenty instantly and efficiently. + +With webhooks, Twenty will send an HTTP POST request to a URL you specify, containing details about the event. You can then handle that data in your application (e.g., to update your external database, trigger workflows, or send alerts). + +## Setting Up a Webhook +To create a webhook in Twenty, use the **API & Webhooks** settings in your Twenty app (Developer settings): + +1. **Navigate to Settings:** In your Twenty application, go to **Settings** (ensure Advanced mode is enabled to see developer options). +2. **Create a Webhook:** Under **Webhooks** click on **+ Create webhook**. +3. **Enter URL:** Provide the endpoint URL on your server where you want Twenty to send webhook requests. This should be a publicly accessible URL that can handle POST requests. +4. **Save:** Click **Save** to create the webhook. The new webhook will be active immediately. + +You can create multiple webhooks if you need to send different events to different endpoints. Each webhook is essentially a subscription for all relevant events (at this time, Twenty sends all event types to the given URL; filtering specific event types may be configurable in the UI). If you ever need to remove a webhook, you can delete it from the same settings page (select the webhook and choose delete). + +## Events and Payloads +Once a webhook is set up, Twenty will send an HTTP POST request to your specified URL whenever a trigger event occurs in your CRM data. Common events that trigger webhooks include: + +* **Record Created:** e.g. a new person is added (`person.created`), a new company is created (`company.created`), a note is created (`note.created`), etc. +* **Record Updated:** e.g. an existing person's information is updated (`person.updated`), a company record is edited (`company.updated`), etc. +* **Record Deleted:** e.g. a person or company is deleted (`person.deleted`, `company.deleted`). +* **Other Events:** If applicable, other object events or custom triggers (for instance, if tasks or other objects are updated, similar event types would be used like `task.created`, `note.updated`, etc.). + +The webhook POST request contains a JSON payload in its body. The payload will generally include at least two things: the type of event, and the data related to that event (often the record that was created/updated). For example, a webhook for a newly created person might send a payload like: + +``` +{ + "event": "person.created", + "data": { + "id": "abc12345", + "firstName": "Alice", + "lastName": "Doe", + "email": "alice@example.com", + "createdAt": "2025-02-10T15:30:45Z", + "createdBy": "user_123" + }, + "timestamp": "2025-02-10T15:30:50Z" +} +``` + +In this example: + +* `"event"` specifies what happened (`person.created`). +* `"data"` contains the new record's details (the same information you would get if you requested that person via the API). +* `"timestamp"` is when the event occurred (in UTC). + +Your endpoint should be prepared to receive such JSON data via POST. Typically, you'll parse the JSON, look at the `"event"` type to understand what happened, and then use the `"data"` accordingly (e.g., create a new contact in your system, or update an existing one). + +**Note:** It's important to respond with a **2xx HTTP status** from your webhook endpoint to acknowledge successful receipt. If the Twenty webhook sender does not get a 2xx response, it may consider the delivery failed. (In the future, retry logic might attempt to resend failed webhooks, so always strive to return a 200 OK as quickly as possible after processing the data.) + +## Webhook Validation + +To ensure the security of your webhook endpoints, Twenty includes a signature in the `X-Twenty-Webhook-Signature` header. + +This signature is an HMAC SHA256 hash of the request payload, computed using your webhook secret. + +To validate the signature, you'll need to: +1. Concatenate the timestamp (from `X-Twenty-Webhook-Timestamp` header), a colon, and the JSON string of the payload +2. Compute the HMAC SHA256 hash using your webhook secret as the key () +3. Compare the resulting hex digest with the signature header + +Here's an example in Node.js: + +```javascript +const crypto = require("crypto"); +const timestamp = "1735066639761"; +const payload = JSON.stringify({...}); +const secret = "your-secret"; +const stringToSign = `${timestamp}:${JSON.stringify(payload)}`; +const signature = crypto.createHmac("sha256", secret) + .update(stringToSign) + .digest("hex"); +``` diff --git a/packages/twenty-website/src/content/developers/constants/DocsIndex.ts b/packages/twenty-website/src/content/developers/constants/DocsIndex.ts index dbdcfdcf8..7f4da52a9 100644 --- a/packages/twenty-website/src/content/developers/constants/DocsIndex.ts +++ b/packages/twenty-website/src/content/developers/constants/DocsIndex.ts @@ -9,18 +9,7 @@ export const DOCS_INDEX = { { fileName: 'cloud-providers' }, { fileName: 'troubleshooting' }, ], - }, - Extending: { - 'Rest APIs': [ - { fileName: 'rest-apis' }, - { fileName: 'core-api-rest' }, - { fileName: 'metadata-api-rest' }, - ], - 'GraphQL APIs': [ - { fileName: 'graphql-apis' }, - { fileName: 'core-api-graphql' }, - { fileName: 'metadata-api-graphql' }, - ], + 'API and Webhooks': [{ fileName: 'api' }, { fileName: 'webhooks' }], }, Contributing: { 'Bugs and Requests': [{ fileName: 'bug-and-requests' }], diff --git a/packages/twenty-website/src/content/developers/graphql-apis/core-api-graphql.mdx b/packages/twenty-website/src/content/developers/graphql-apis/core-api-graphql.mdx deleted file mode 100644 index 9dcde5312..000000000 --- a/packages/twenty-website/src/content/developers/graphql-apis/core-api-graphql.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Core API -icon: TbRocket -image: /images/user-guide/import-export-data/cloud.png ---- \ No newline at end of file diff --git a/packages/twenty-website/src/content/developers/graphql-apis/metadata-api-graphql.mdx b/packages/twenty-website/src/content/developers/graphql-apis/metadata-api-graphql.mdx deleted file mode 100644 index 4f919c578..000000000 --- a/packages/twenty-website/src/content/developers/graphql-apis/metadata-api-graphql.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Metadata API -icon: TbRocket -image: /images/user-guide/kanban-views/kanban.png ---- \ No newline at end of file diff --git a/packages/twenty-website/src/content/developers/rest-apis/core-api-rest.mdx b/packages/twenty-website/src/content/developers/rest-apis/core-api-rest.mdx deleted file mode 100644 index 9dcde5312..000000000 --- a/packages/twenty-website/src/content/developers/rest-apis/core-api-rest.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Core API -icon: TbRocket -image: /images/user-guide/import-export-data/cloud.png ---- \ No newline at end of file diff --git a/packages/twenty-website/src/content/developers/rest-apis/metadata-api-rest.mdx b/packages/twenty-website/src/content/developers/rest-apis/metadata-api-rest.mdx deleted file mode 100644 index 4f919c578..000000000 --- a/packages/twenty-website/src/content/developers/rest-apis/metadata-api-rest.mdx +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Metadata API -icon: TbRocket -image: /images/user-guide/kanban-views/kanban.png ---- \ No newline at end of file