[{"data":1,"prerenderedAt":563},["ShallowReactive",2],{"navigation_docs":3,"-platforms-gitlab":80,"-platforms-gitlab-surround":558},[4,56],{"title":5,"path":6,"stem":7,"children":8,"icon":55},"Guide","\u002Fguide","1.guide\u002F01.index",[9,11,15,19,23,27,31,35,39,43,47,51],{"title":10,"path":6,"stem":7},"Getting Started",{"title":12,"path":13,"stem":14},"Authentication","\u002Fguide\u002Fauth","1.guide\u002F02.auth",{"title":16,"path":17,"stem":18},"Repositories","\u002Fguide\u002Frepositories","1.guide\u002F03.repositories",{"title":20,"path":21,"stem":22},"Issues","\u002Fguide\u002Fissues","1.guide\u002F04.issues",{"title":24,"path":25,"stem":26},"Pull requests","\u002Fguide\u002Fpull-requests","1.guide\u002F05.pull-requests",{"title":28,"path":29,"stem":30},"Review threads","\u002Fguide\u002Fthreads","1.guide\u002F06.threads",{"title":32,"path":33,"stem":34},"Commits and CI","\u002Fguide\u002Fcommits","1.guide\u002F07.commits",{"title":36,"path":37,"stem":38},"Contribution templates","\u002Fguide\u002Ftemplates","1.guide\u002F08.templates",{"title":40,"path":41,"stem":42},"Code search","\u002Fguide\u002Fcode-search","1.guide\u002F09.code-search",{"title":44,"path":45,"stem":46},"Agents","\u002Fguide\u002Fagents","1.guide\u002F10.agents",{"title":48,"path":49,"stem":50},"Custom providers","\u002Fguide\u002Fcustom","1.guide\u002F11.custom",{"title":52,"path":53,"stem":54},"Explorer","\u002Fguide\u002Fexplorer","1.guide\u002F12.explorer","i-lucide-book-open",{"title":57,"path":58,"stem":59,"children":60,"icon":79},"Platforms","\u002Fplatforms","2.platforms\u002F0.index",[61,63,67,71,75],{"title":62,"path":58,"stem":59},"Overview",{"title":64,"path":65,"stem":66},"GitHub","\u002Fplatforms\u002Fgithub","2.platforms\u002F01.github",{"title":68,"path":69,"stem":70},"GitLab","\u002Fplatforms\u002Fgitlab","2.platforms\u002F02.gitlab",{"title":72,"path":73,"stem":74},"Gitea","\u002Fplatforms\u002Fgitea","2.platforms\u002F03.gitea",{"title":76,"path":77,"stem":78},"GitBucket","\u002Fplatforms\u002Fgitbucket","2.platforms\u002F04.gitbucket","i-lucide-library",{"id":81,"title":68,"body":82,"description":551,"extension":552,"links":553,"meta":554,"navigation":147,"path":69,"seo":556,"stem":70,"__hash__":557},"docs\u002F2.platforms\u002F02.gitlab.md",{"type":83,"value":84,"toc":544},"minimark",[85,89,94,247,258,262,406,422,426,459,473,485,489,531,535,540],[86,87],"platform-facts",{"platform":88},"gitlab",[90,91,93],"h2",{"id":92},"address-it","Address it",[95,96,101],"pre",{"className":97,"code":98,"language":99,"meta":100,"style":100},"language-ts shiki shiki-themes github-light github-light poimandres","import { createProvider } from \"@agntn\u002Fforges\";\n\nconst gitlab = createProvider(\"gitlab\"); \u002F\u002F GITLAB_TOKEN, GL_TOKEN, GITLAB_PAT, then glab\nconst selfHosted = createProvider(\"gitlab\", {\n  token: \"glpat-…\",\n  baseURL: \"https:\u002F\u002Fgitlab.example.com\",\n});\n","ts","",[102,103,104,142,149,182,205,224,241],"code",{"__ignoreMap":100},[105,106,109,113,117,121,124,128,132,136,139],"span",{"class":107,"line":108},"line",1,[105,110,112],{"class":111},"sP0CR","import",[105,114,116],{"class":115},"sKlNE"," {",[105,118,120],{"class":119},"snHMy"," createProvider",[105,122,123],{"class":115}," }",[105,125,127],{"class":126},"stCPd"," from",[105,129,131],{"class":130},"scVjq"," \"",[105,133,135],{"class":134},"sQ7BG","@agntn\u002Fforges",[105,137,138],{"class":130},"\"",[105,140,141],{"class":115},";\n",[105,143,145],{"class":107,"line":144},2,[105,146,148],{"emptyLinePlaceholder":147},true,"\n",[105,150,152,156,160,163,166,169,171,173,175,178],{"class":107,"line":151},3,[105,153,155],{"class":154},"s1TYA","const",[105,157,159],{"class":158},"saoiD"," gitlab",[105,161,162],{"class":154}," =",[105,164,120],{"class":165},"sULi6",[105,167,168],{"class":115},"(",[105,170,138],{"class":130},[105,172,88],{"class":134},[105,174,138],{"class":130},[105,176,177],{"class":115},"); ",[105,179,181],{"class":180},"sjhu3","\u002F\u002F GITLAB_TOKEN, GL_TOKEN, GITLAB_PAT, then glab\n",[105,183,185,187,190,192,194,196,198,200,202],{"class":107,"line":184},4,[105,186,155],{"class":154},[105,188,189],{"class":158}," selfHosted",[105,191,162],{"class":154},[105,193,120],{"class":165},[105,195,168],{"class":115},[105,197,138],{"class":130},[105,199,88],{"class":134},[105,201,138],{"class":130},[105,203,204],{"class":115},", {\n",[105,206,208,211,214,216,219,221],{"class":107,"line":207},5,[105,209,210],{"class":119},"  token",[105,212,213],{"class":115},":",[105,215,131],{"class":130},[105,217,218],{"class":134},"glpat-…",[105,220,138],{"class":130},[105,222,223],{"class":115},",\n",[105,225,227,230,232,234,237,239],{"class":107,"line":226},6,[105,228,229],{"class":119},"  baseURL",[105,231,213],{"class":115},[105,233,131],{"class":130},[105,235,236],{"class":134},"https:\u002F\u002Fgitlab.example.com",[105,238,138],{"class":130},[105,240,223],{"class":115},[105,242,244],{"class":107,"line":243},7,[105,245,246],{"class":115},"});\n",[248,249,250,253,254,257],"p",{},[102,251,252],{},"\u002Fapi\u002Fv4"," is added when the base URL lacks it. The token travels in ",[102,255,256],{},"Private-Token",".",[90,259,261],{"id":260},"what-it-reads","What it reads",[263,264,265,278],"table",{},[266,267,268],"thead",{},[269,270,271,275],"tr",{},[272,273,274],"th",{},"Resource",[272,276,277],{},"Endpoint",[279,280,281,300,319,335,351,361,374,387],"tbody",{},[269,282,283,287],{},[284,285,286],"td",{},"repos",[284,288,289,292,293,292,296,299],{},[102,290,291],{},"GET \u002Fprojects\u002F:id",", ",[102,294,295],{},"GET \u002Fusers\u002F:owner\u002Fprojects",[102,297,298],{},"GET \u002Fgroups\u002F:owner\u002Fprojects"," on 404",[269,301,302,305],{},[284,303,304],{},"issues",[284,306,307,292,310,292,313,292,316],{},[102,308,309],{},"GET \u002Fprojects\u002F:id\u002Fissues",[102,311,312],{},"…\u002Fissues?search=",[102,314,315],{},"POST \u002Fprojects\u002F:id\u002Fissues",[102,317,318],{},"…\u002Fissues\u002F:iid\u002Fnotes",[269,320,321,324],{},[284,322,323],{},"merge requests",[284,325,326,292,329,292,332],{},[102,327,328],{},"GET \u002Fprojects\u002F:id\u002Fmerge_requests",[102,330,331],{},"…\u002Fmerge_requests\u002F:iid\u002Fdiffs",[102,333,334],{},"…\u002Fmerge_requests\u002F:iid\u002Fpipelines",[269,336,337,340],{},[284,338,339],{},"commits",[284,341,342,292,345,292,348],{},[102,343,344],{},"GET \u002Fprojects\u002F:id\u002Frepository\u002Fcommits",[102,346,347],{},"…\u002Fcommits\u002F:sha",[102,349,350],{},"…\u002Fcommits\u002F:sha\u002Fdiff",[269,352,353,356],{},[284,354,355],{},"CI runs",[284,357,358],{},[102,359,360],{},"GET \u002Fprojects\u002F:id\u002Fpipelines",[269,362,363,366],{},[284,364,365],{},"threads",[284,367,368,292,371],{},[102,369,370],{},"GET \u002Fprojects\u002F:id\u002Fmerge_requests\u002F:iid\u002Fdiscussions",[102,372,373],{},"PUT …\u002Fdiscussions\u002F:id",[269,375,376,379],{},[284,377,378],{},"templates",[284,380,381,292,384],{},[102,382,383],{},"GET \u002Fprojects\u002F:id\u002Ftemplates\u002Fissues",[102,385,386],{},"…\u002Ftemplates\u002Fmerge_requests",[269,388,389,391],{},[284,390,102],{},[284,392,393,292,396,292,399,402,403],{},[102,394,395],{},"GET \u002Fsearch",[102,397,398],{},"GET \u002Fgroups\u002F:id\u002Fsearch",[102,400,401],{},"GET \u002Fprojects\u002F:id\u002Fsearch"," with ",[102,404,405],{},"scope=blobs",[248,407,408,411,412,292,415,418,419,257],{},[102,409,410],{},"owner\u002Frepo"," becomes a project id once and is cached per provider (",[102,413,414],{},"gitlab.projectIdCacheMax",[102,416,417],{},"gitlab.projectIdCacheTtl"," in the config). Pagination reads ",[102,420,421],{},"x-next-page",[90,423,425],{"id":424},"what-comes-back","What comes back",[248,427,428,431,432,435,436,439,440,443,444,447,448,451,452,455,456,458],{},[102,429,430],{},"number"," is the ",[102,433,434],{},"iid",", never the global ",[102,437,438],{},"id",". ",[102,441,442],{},"Thread.isOutdated"," is always ",[102,445,446],{},"false",", the API has no such flag. Changed files of a merge request carry ",[102,449,450],{},"null"," counts when the diff is collapsed or oversized. Commit reads take at most 10 000 diff rows per call and ",[102,453,454],{},"filesComplete"," is ",[102,457,450],{}," past that.",[248,460,461,464,465,468,469,472],{},[102,462,463],{},"listComments"," asks for notes with an explicit ascending sort and drops two kinds: system notes about label and state churn, and inline ",[102,466,467],{},"DiffNote","s, which are threads. So a short page with ",[102,470,471],{},"hasNextPage: true"," is normal, keep paging.",[248,474,475,476,455,479,482,483,257],{},"Templates come from the effective template API, group and instance inheritance already applied. When the API hides the winning source, ",[102,477,478],{},"scope",[102,480,481],{},"unknown"," and the source fields are ",[102,484,450],{},[90,486,488],{"id":487},"gotchas","Gotchas",[490,491,492,496,499,513,522,525],"ul",{},[493,494,495],"li",{},"Discussions answer 401 without a token, even on a public project. Repositories, issues, merge requests, commits and pipelines read fine anonymously. Discussions do not, and I did not expect that either.",[493,497,498],{},"Every search call needs a token. Global and group code search also need Premium or Ultimate with advanced or exact code search on. Project search does not.",[493,500,501,504,505,508,509,512],{},[102,502,503],{},"\u002Fusers\u002F:owner\u002Fprojects"," is a 404 for a group. ",[102,506,507],{},"repos.list"," falls back to ",[102,510,511],{},"\u002Fgroups\u002F:owner\u002Fprojects"," on that status only.",[493,514,515,516,519,520,257],{},"Search qualifiers are plain text. ",[102,517,518],{},"label:bug"," searches for the string ",[102,521,518],{},[493,523,524],{},"GitLab Free takes one assignee. Two are rejected before the request.",[493,526,527,530],{},[102,528,529],{},"users.get"," costs two requests: the username search returns a stub, the id from it reads the full profile.",[90,532,534],{"id":533},"where-it-lives","Where it lives",[248,536,537,257],{},[102,538,539],{},"src\u002Fproviders\u002Fgitlab.ts",[541,542,543],"style",{},"html pre.shiki code .sP0CR, html code.shiki .sP0CR{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#5DE4C7}html pre.shiki code .sKlNE, html code.shiki .sKlNE{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#A6ACCD}html pre.shiki code .snHMy, html code.shiki .snHMy{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#ADD7FF}html pre.shiki code .stCPd, html code.shiki .stCPd{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#A6ACCD}html pre.shiki code .scVjq, html code.shiki .scVjq{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#A6ACCD}html pre.shiki code .sQ7BG, html code.shiki .sQ7BG{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#5DE4C7}html pre.shiki code .s1TYA, html code.shiki .s1TYA{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#91B4D5}html pre.shiki code .saoiD, html code.shiki .saoiD{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#E4F0FB}html pre.shiki code .sULi6, html code.shiki .sULi6{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#E4F0FBD0}html pre.shiki code .sjhu3, html code.shiki .sjhu3{--shiki-light:#6A737D;--shiki-light-font-style:inherit;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#767C9DB0;--shiki-dark-font-style:italic}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);}",{"title":100,"searchDepth":144,"depth":144,"links":545},[546,547,548,549,550],{"id":92,"depth":144,"text":93},{"id":260,"depth":144,"text":261},{"id":424,"depth":144,"text":425},{"id":487,"depth":144,"text":488},{"id":533,"depth":144,"text":534},"API v4 with Private-Token auth, project ids resolved and cached for you, iid as the number, and a group fallback for owners that are not users.","md",null,{"icon":555},"i-simple-icons-gitlab",{"title":68,"description":551},"2WJcXL5ZuVYC_TrWhmNv4GKcw-cLZuezn8R32aiNhBI",[559,561],{"title":64,"path":65,"stem":66,"description":560,"children":-1},"REST v3 for everything except review threads, which need GraphQL for their resolved flag. GitHub Enterprise works through baseURL.",{"title":72,"path":73,"stem":74,"description":562,"children":-1},"API v1 with limit instead of per_page, empty strings and nulls where fields are missing, and Codeberg or any Forgejo instance through baseURL.",1788525966686]