[{"data":1,"prerenderedAt":965},["ShallowReactive",2],{"/docs/scripts/free-phone/exports/crewlink-exports":3,"/docs/scripts/free-phone/exports/crewlink-exports-surround":953,"/docs/scripts/free-phone/exports/crewlink-exports-implemented-suggestions":964},{"id":4,"title":5,"body":6,"description":944,"extension":945,"head":946,"implementedSuggestions":946,"meta":947,"navigation":141,"path":948,"schemaOrg":946,"seo":949,"sitemap":950,"stem":951,"__hash__":952},"docs/1.docs/scripts/4.free-phone/3.exports/4.crewlink-exports.md","CrewLink Exports",{"type":7,"value":8,"toc":934},"minimark",[9,17,20,33,37,44,51,89,193,199,229,315,321,353,400,406,438,525,531,622,822,828,863,930],[10,11,12],"p",{},[13,14,16],"a",{"href":15},"/docs/scripts/free-phone/exports","All exports",[10,18,19],{},"This page documents the supported public integration calls. Client exports must run in a client\nscript and server exports must run in a server script. Internal NUI callbacks and net events are not\npublic APIs.",[21,22,25],"callout",{"color":23,"icon":24},"success","i-lucide-shield-check",[10,26,27,28,32],{},"Keep the resource folder named ",[29,30,31],"code",{},"sky_phone",". Validate every returned success value and keep money,\npermissions, ownership, and other authoritative changes on the server.",[34,35,5],"h2",{"id":36},"crewlink-exports",[10,38,39,40,43],{},"CrewLink read exports require a valid phone session. External ping mutations additionally require\nthe calling resource in ",[29,41,42],{},"Config.CrewLink.ExternalPingResources",".",[45,46,48],"h3",{"id":47},"getcrewlinkactivegroupsource",[29,49,50],{},"GetCrewLinkActiveGroup(source)",[52,53,54,62,80],"ul",{},[55,56,57,61],"li",{},[58,59,60],"strong",{},"Purpose",": Returns the active CrewLink group of a player with an open, unlocked phone session.",[55,63,64,67,68],{},[58,65,66],{},"Arguments",":\n",[52,69,70],{},[55,71,72,75,76,79],{},[29,73,74],{},"source"," (",[29,77,78],{},"number","): Player server ID.",[55,81,82,85,86,43],{},[58,83,84],{},"Returns",": ",[29,87,88],{},"table | nil",[90,91,97],"pre",{"className":92,"code":93,"filename":94,"language":95,"meta":96,"style":96},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","local group = exports[\"sky_phone\"]:GetCrewLinkActiveGroup(source)\n\nif group then\n    print((\"Active CrewLink group: %s\"):format(group.id))\nend\n","server.lua","lua","",[29,98,99,136,143,155,187],{"__ignoreMap":96},[100,101,104,108,112,115,118,121,124,126,129,133],"span",{"class":102,"line":103},"line",1,[100,105,107],{"class":106},"sMK4o","local",[100,109,111],{"class":110},"sTEyZ"," group ",[100,113,114],{"class":106},"=",[100,116,117],{"class":110}," exports[",[100,119,120],{"class":106},"\"",[100,122,31],{"class":123},"sfazB",[100,125,120],{"class":106},[100,127,128],{"class":110},"]:",[100,130,132],{"class":131},"s2Zo4","GetCrewLinkActiveGroup",[100,134,135],{"class":110},"(source)\n",[100,137,139],{"class":102,"line":138},2,[100,140,142],{"emptyLinePlaceholder":141},true,"\n",[100,144,146,150,152],{"class":102,"line":145},3,[100,147,149],{"class":148},"s7zQu","if",[100,151,111],{"class":110},[100,153,154],{"class":148},"then\n",[100,156,158,161,164,166,169,171,174,177,180,184],{"class":102,"line":157},4,[100,159,160],{"class":131},"    print",[100,162,163],{"class":110},"((",[100,165,120],{"class":106},[100,167,168],{"class":123},"Active CrewLink group: %s",[100,170,120],{"class":106},[100,172,173],{"class":110},"):",[100,175,176],{"class":131},"format",[100,178,179],{"class":110},"(group.",[100,181,183],{"class":182},"sBMFI","id",[100,185,186],{"class":110},"))\n",[100,188,190],{"class":102,"line":189},5,[100,191,192],{"class":148},"end\n",[45,194,196],{"id":195},"getcrewlinkgroupmembersgroupid",[29,197,198],{},"GetCrewLinkGroupMembers(groupId)",[52,200,201,206,221],{},[55,202,203,205],{},[58,204,60],{},": Returns public member data for a CrewLink group.",[55,207,208,67,210],{},[58,209,66],{},[52,211,212],{},[55,213,214,75,217,220],{},[29,215,216],{},"groupId",[29,218,219],{},"string","): CrewLink group ID.",[55,222,223,85,225,228],{},[58,224,84],{},[29,226,227],{},"table"," — array of member records.",[90,230,232],{"className":92,"code":231,"filename":94,"language":95,"meta":96,"style":96},"local members = exports[\"sky_phone\"]:GetCrewLinkGroupMembers(group_id)\n\nfor _, member in ipairs(members) do\n    print(member.id, member.username, member.role, member.joinedAt)\nend\n",[29,233,234,259,263,283,311],{"__ignoreMap":96},[100,235,236,238,241,243,245,247,249,251,253,256],{"class":102,"line":103},[100,237,107],{"class":106},[100,239,240],{"class":110}," members ",[100,242,114],{"class":106},[100,244,117],{"class":110},[100,246,120],{"class":106},[100,248,31],{"class":123},[100,250,120],{"class":106},[100,252,128],{"class":110},[100,254,255],{"class":131},"GetCrewLinkGroupMembers",[100,257,258],{"class":110},"(group_id)\n",[100,260,261],{"class":102,"line":138},[100,262,142],{"emptyLinePlaceholder":141},[100,264,265,268,271,274,277,280],{"class":102,"line":145},[100,266,267],{"class":148},"for",[100,269,270],{"class":110}," _, member ",[100,272,273],{"class":148},"in",[100,275,276],{"class":131}," ipairs",[100,278,279],{"class":110},"(members) ",[100,281,282],{"class":148},"do\n",[100,284,285,287,290,292,295,298,300,303,305,308],{"class":102,"line":157},[100,286,160],{"class":131},[100,288,289],{"class":110},"(member.",[100,291,183],{"class":182},[100,293,294],{"class":110},", member.",[100,296,297],{"class":182},"username",[100,299,294],{"class":110},[100,301,302],{"class":182},"role",[100,304,294],{"class":110},[100,306,307],{"class":182},"joinedAt",[100,309,310],{"class":110},")\n",[100,312,313],{"class":102,"line":189},[100,314,192],{"class":148},[45,316,318],{"id":317},"iscrewlinkgroupmembersource-groupid",[29,319,320],{},"IsCrewLinkGroupMember(source, groupId)",[52,322,323,328,346],{},[55,324,325,327],{},[58,326,60],{},": Checks whether a player belongs to a CrewLink group.",[55,329,330,67,332],{},[58,331,66],{},[52,333,334,340],{},[55,335,336,75,338,79],{},[29,337,74],{},[29,339,78],{},[55,341,342,75,344,220],{},[29,343,216],{},[29,345,219],{},[55,347,348,85,350,43],{},[58,349,84],{},[29,351,352],{},"boolean",[90,354,356],{"className":92,"code":355,"filename":94,"language":95,"meta":96,"style":96},"if exports[\"sky_phone\"]:IsCrewLinkGroupMember(source, group_id) then\n    print(\"Player is a member of the group\")\nend\n",[29,357,358,380,396],{"__ignoreMap":96},[100,359,360,362,364,366,368,370,372,375,378],{"class":102,"line":103},[100,361,149],{"class":148},[100,363,117],{"class":110},[100,365,120],{"class":106},[100,367,31],{"class":123},[100,369,120],{"class":106},[100,371,128],{"class":110},[100,373,374],{"class":131},"IsCrewLinkGroupMember",[100,376,377],{"class":110},"(source, group_id) ",[100,379,154],{"class":148},[100,381,382,384,387,389,392,394],{"class":102,"line":138},[100,383,160],{"class":131},[100,385,386],{"class":110},"(",[100,388,120],{"class":106},[100,390,391],{"class":123},"Player is a member of the group",[100,393,120],{"class":106},[100,395,310],{"class":110},[100,397,398],{"class":102,"line":145},[100,399,192],{"class":148},[45,401,403],{"id":402},"getcrewlinkgrouprolesource-groupid",[29,404,405],{},"GetCrewLinkGroupRole(source, groupId)",[52,407,408,413,431],{},[55,409,410,412],{},[58,411,60],{},": Returns a player's role in a CrewLink group.",[55,414,415,67,417],{},[58,416,66],{},[52,418,419,425],{},[55,420,421,75,423,79],{},[29,422,74],{},[29,424,78],{},[55,426,427,75,429,220],{},[29,428,216],{},[29,430,219],{},[55,432,433,85,435,43],{},[58,434,84],{},[29,436,437],{},"string | nil",[90,439,441],{"className":92,"code":440,"filename":94,"language":95,"meta":96,"style":96},"local role = exports[\"sky_phone\"]:GetCrewLinkGroupRole(source, group_id)\n\nif role == \"owner\" or role == \"moderator\" then\n    print(\"Player can manage this CrewLink group\")\nend\n",[29,442,443,468,472,506,521],{"__ignoreMap":96},[100,444,445,447,450,452,454,456,458,460,462,465],{"class":102,"line":103},[100,446,107],{"class":106},[100,448,449],{"class":110}," role ",[100,451,114],{"class":106},[100,453,117],{"class":110},[100,455,120],{"class":106},[100,457,31],{"class":123},[100,459,120],{"class":106},[100,461,128],{"class":110},[100,463,464],{"class":131},"GetCrewLinkGroupRole",[100,466,467],{"class":110},"(source, group_id)\n",[100,469,470],{"class":102,"line":138},[100,471,142],{"emptyLinePlaceholder":141},[100,473,474,476,478,481,484,487,490,493,495,497,499,502,504],{"class":102,"line":145},[100,475,149],{"class":148},[100,477,449],{"class":110},[100,479,480],{"class":106},"==",[100,482,483],{"class":106}," \"",[100,485,486],{"class":123},"owner",[100,488,489],{"class":106},"\" ",[100,491,492],{"class":106},"or",[100,494,449],{"class":110},[100,496,480],{"class":106},[100,498,483],{"class":106},[100,500,501],{"class":123},"moderator",[100,503,489],{"class":106},[100,505,154],{"class":148},[100,507,508,510,512,514,517,519],{"class":102,"line":157},[100,509,160],{"class":131},[100,511,386],{"class":110},[100,513,120],{"class":106},[100,515,516],{"class":123},"Player can manage this CrewLink group",[100,518,120],{"class":106},[100,520,310],{"class":110},[100,522,523],{"class":102,"line":189},[100,524,192],{"class":148},[45,526,528],{"id":527},"createcrewlinkpinggroupid-data",[29,529,530],{},"CreateCrewLinkPing(groupId, data)",[52,532,533,538,614],{},[55,534,535,537],{},[58,536,60],{},": Creates a shared external ping for a CrewLink group.",[55,539,540,67,542],{},[58,541,66],{},[52,543,544,551],{},[55,545,546,75,548,550],{},[29,547,216],{},[29,549,219],{},"): Target group ID.",[55,552,553,75,556,558,559],{},[29,554,555],{},"data",[29,557,227],{},"): Ping definition.\n",[52,560,561,586,594,605],{},[55,562,563,75,566,568,569,572,573,572,576,572,579,582,583,43],{},[29,564,565],{},"type",[29,567,219],{},"): ",[29,570,571],{},"meeting",", ",[29,574,575],{},"danger",[29,577,578],{},"help",[29,580,581],{},"target",", or ",[29,584,585],{},"info",[55,587,588,75,591,593],{},[29,589,590],{},"label",[29,592,219],{},"): Player-facing ping label.",[55,595,596,75,599,568,601,604],{},[29,597,598],{},"coords",[29,600,227],{},[29,602,603],{},"{ x, y, z }"," world coordinates.",[55,606,607,75,610,613],{},[29,608,609],{},"lifetimeSeconds",[29,611,612],{},"number?","): Requested lifetime within configured limits.",[55,615,616,85,618,621],{},[58,617,84],{},[29,619,620],{},"table | nil, string?"," — created ping or an error code.",[90,623,625],{"className":92,"code":624,"filename":94,"language":95,"meta":96,"style":96},"local ping, error_code = exports[\"sky_phone\"]:CreateCrewLinkPing(\n    group_id,\n    {\n        type = \"target\",\n        label = \"Mission target\",\n        coords = {\n            x = 125.0,\n            y = -840.0,\n            z = 30.0,\n        },\n        lifetimeSeconds = 180,\n    }\n)\n\nif not ping then\n    print((\"CrewLink ping failed: %s\"):format(error_code))\nend\n",[29,626,627,652,657,662,678,694,705,719,735,748,754,767,773,778,783,796,817],{"__ignoreMap":96},[100,628,629,631,634,636,638,640,642,644,646,649],{"class":102,"line":103},[100,630,107],{"class":106},[100,632,633],{"class":110}," ping, error_code ",[100,635,114],{"class":106},[100,637,117],{"class":110},[100,639,120],{"class":106},[100,641,31],{"class":123},[100,643,120],{"class":106},[100,645,128],{"class":110},[100,647,648],{"class":131},"CreateCrewLinkPing",[100,650,651],{"class":110},"(\n",[100,653,654],{"class":102,"line":138},[100,655,656],{"class":110},"    group_id,\n",[100,658,659],{"class":102,"line":145},[100,660,661],{"class":110},"    {\n",[100,663,664,667,669,671,673,675],{"class":102,"line":157},[100,665,666],{"class":110},"        type ",[100,668,114],{"class":106},[100,670,483],{"class":106},[100,672,581],{"class":123},[100,674,120],{"class":106},[100,676,677],{"class":110},",\n",[100,679,680,683,685,687,690,692],{"class":102,"line":189},[100,681,682],{"class":110},"        label ",[100,684,114],{"class":106},[100,686,483],{"class":106},[100,688,689],{"class":123},"Mission target",[100,691,120],{"class":106},[100,693,677],{"class":110},[100,695,697,700,702],{"class":102,"line":696},6,[100,698,699],{"class":110},"        coords ",[100,701,114],{"class":106},[100,703,704],{"class":110}," {\n",[100,706,708,711,713,717],{"class":102,"line":707},7,[100,709,710],{"class":110},"            x ",[100,712,114],{"class":106},[100,714,716],{"class":715},"sbssI"," 125.0",[100,718,677],{"class":110},[100,720,722,725,727,730,733],{"class":102,"line":721},8,[100,723,724],{"class":110},"            y ",[100,726,114],{"class":106},[100,728,729],{"class":106}," -",[100,731,732],{"class":715},"840.0",[100,734,677],{"class":110},[100,736,738,741,743,746],{"class":102,"line":737},9,[100,739,740],{"class":110},"            z ",[100,742,114],{"class":106},[100,744,745],{"class":715}," 30.0",[100,747,677],{"class":110},[100,749,751],{"class":102,"line":750},10,[100,752,753],{"class":110},"        },\n",[100,755,757,760,762,765],{"class":102,"line":756},11,[100,758,759],{"class":110},"        lifetimeSeconds ",[100,761,114],{"class":106},[100,763,764],{"class":715}," 180",[100,766,677],{"class":110},[100,768,770],{"class":102,"line":769},12,[100,771,772],{"class":110},"    }\n",[100,774,776],{"class":102,"line":775},13,[100,777,310],{"class":110},[100,779,781],{"class":102,"line":780},14,[100,782,142],{"emptyLinePlaceholder":141},[100,784,786,788,791,794],{"class":102,"line":785},15,[100,787,149],{"class":148},[100,789,790],{"class":106}," not",[100,792,793],{"class":110}," ping ",[100,795,154],{"class":148},[100,797,799,801,803,805,808,810,812,814],{"class":102,"line":798},16,[100,800,160],{"class":131},[100,802,163],{"class":110},[100,804,120],{"class":106},[100,806,807],{"class":123},"CrewLink ping failed: %s",[100,809,120],{"class":106},[100,811,173],{"class":110},[100,813,176],{"class":131},[100,815,816],{"class":110},"(error_code))\n",[100,818,820],{"class":102,"line":819},17,[100,821,192],{"class":148},[45,823,825],{"id":824},"removecrewlinkpinggroupid-pingid",[29,826,827],{},"RemoveCrewLinkPing(groupId, pingId)",[52,829,830,835,857],{},[55,831,832,834],{},[58,833,60],{},": Removes an external ping created by the calling resource.",[55,836,837,67,839],{},[58,838,66],{},[52,840,841,847],{},[55,842,843,75,845,220],{},[29,844,216],{},[29,846,219],{},[55,848,849,75,852,854,855,43],{},[29,850,851],{},"pingId",[29,853,219],{},"): Ping ID returned by ",[29,856,648],{},[55,858,859,85,861,43],{},[58,860,84],{},[29,862,352],{},[90,864,866],{"className":92,"code":865,"filename":94,"language":95,"meta":96,"style":96},"local removed = exports[\"sky_phone\"]:RemoveCrewLinkPing(group_id, ping.id)\n\nif not removed then\n    print(\"Ping does not exist or belongs to another resource\")\nend\n",[29,867,868,897,901,911,926],{"__ignoreMap":96},[100,869,870,872,875,877,879,881,883,885,887,890,893,895],{"class":102,"line":103},[100,871,107],{"class":106},[100,873,874],{"class":110}," removed ",[100,876,114],{"class":106},[100,878,117],{"class":110},[100,880,120],{"class":106},[100,882,31],{"class":123},[100,884,120],{"class":106},[100,886,128],{"class":110},[100,888,889],{"class":131},"RemoveCrewLinkPing",[100,891,892],{"class":110},"(group_id, ping.",[100,894,183],{"class":182},[100,896,310],{"class":110},[100,898,899],{"class":102,"line":138},[100,900,142],{"emptyLinePlaceholder":141},[100,902,903,905,907,909],{"class":102,"line":145},[100,904,149],{"class":148},[100,906,790],{"class":106},[100,908,874],{"class":110},[100,910,154],{"class":148},[100,912,913,915,917,919,922,924],{"class":102,"line":157},[100,914,160],{"class":131},[100,916,386],{"class":110},[100,918,120],{"class":106},[100,920,921],{"class":123},"Ping does not exist or belongs to another resource",[100,923,120],{"class":106},[100,925,310],{"class":110},[100,927,928],{"class":102,"line":189},[100,929,192],{"class":148},[931,932,933],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":96,"searchDepth":103,"depth":138,"links":935},[936],{"id":36,"depth":138,"text":5,"children":937},[938,939,940,941,942,943],{"id":47,"depth":145,"text":50},{"id":195,"depth":145,"text":198},{"id":317,"depth":145,"text":320},{"id":402,"depth":145,"text":405},{"id":527,"depth":145,"text":530},{"id":824,"depth":145,"text":827},"CrewLink Exports for the Free Phone custom-app, billing and CrewLink integrations.","md",null,{},"/docs/scripts/free-phone/exports/crewlink-exports",{"title":5,"description":944},{"loc":948},"1.docs/scripts/4.free-phone/3.exports/4.crewlink-exports","jKUX188mFqPeYSaXx1XeUvA7QvGIuMCvadSPEZYfeZQ",[954,959],{"title":955,"path":956,"stem":957,"description":958,"children":-1},"Billing Exports","/docs/scripts/free-phone/exports/billing-exports","1.docs/scripts/4.free-phone/3.exports/3.billing-exports","Billing Exports for the Free Phone custom-app, billing and CrewLink integrations.",{"title":960,"path":961,"stem":962,"description":963,"children":-1},"Events","/docs/scripts/free-phone/events","1.docs/scripts/4.free-phone/4.events","Public Free Phone observer events, custom-app bridge messages, lifecycle hooks, and internal event boundaries with examples.",[],1791814186230]