PageSourceSearch

https://backstage.io/assets/js/e7475c88.89339986.js

js backstage.io collected 2026-09-24 08:27:01 UTC 5,866 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkbackstage_microsite=self.webpackChunkbackstage_microsite||[]).push([["12705"],{98019(e,t,n){n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var a=n(589583),r=n(474848),s=n(28453);let o={id:"index",title:"External integrations",description:"How to integrate external systems with the Backstage Software Catalog"},i,l={},c=[{value:"Background",id:"background",level:2},{value:"Entity providers",id:"entity-providers",level:2},{value:"Custom processors",id:"custom-processors",level:2},{value:"Incremental entity providers",id:"incremental-entity-providers",level:2}];function d(e){let t={a:"a",em:"em",h2:"h2",p:"p",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(t.p,{children:["Backstage natively supports importing catalog data through\n",(0,r.jsx)(t.a,{href:"/docs/next/features/software-catalog/descriptor-format",children:"entity descriptor YAML files"}),". If your organization\nalready tracks software and ownership in another system, you can integrate\nthat system with the catalog rather than duplicating everything in YAML files."]}
1),"\n",(0,r.jsx)(t.h2,{id:"background",children:"Background"}),"\n",(0,r.jsxs)(t.p,{children:["The catalog backend continuously ingests data from configured sources and\nstores it in its database. The frontend plugin communicates with the backend\nthrough a service API, and the backend runs processing loops to keep\neverything up to date. ",(0,r.jsx)(t.a,{href:"/docs/next/features/software-catalog/life-of-an-entity",children:"The Life of an Entity"})," covers\nthis process in detail and is worth reading first."]}),"\n",(0,r.jsx)(t.p,{children:"There are three ways to bring external data into the catalog. Each is suited\nto different situations."}),"\n",(0,r.jsx)(t.h2,{id:"entity-providers",children:"Entity providers"}),"\n",(0,r.jsxs)(t.p,{children:["An ",(0,r.jsx)(t.em,{children:"entity provider"})," sits at the edge of the catalog as an original source of\nentities. It gives you full control over when and how data is fetched, and can\nperform detailed updates to its set of entities \u2014 replacing them all at once\nor issuing targeted additions and removals."]}),"\n",(0,r.jsx)(t.p,{children:"Use an entity provider when you have a remote system that you want to sync\ninto the catalog on a schedule or in response to events like webhooks. This\nis the most common integration pattern."}),"\n",(0,r.jsxs)(t.p,{children:["See ",(0,r.jsx)(t.a,{href:"/docs/next/features/software-catalog/external-integrations/entity-providers",children:"Custom entity providers"})," for a full walkthrough."]}),"\n",(0,r.jsx)(t.h2,{id:"custom-processors",children:"Custom processors"}),"\n",(0,r.jsxs)(t.p,{children:["A ",(0,r.jsx)(t.em,{children:"processor"})," runs inside the catalog's processing loop. It can enrich,\nvalidate, or transform entities after they have been ingested, and can emit\nchild entities based on what it finds."]}),"\n",(0,r.jsx)(t.p,{children:"Use a processor when you want to read from a custom location type, annotate\nentities as they pass through the catalog, or validate entities of a\nparticular kind."}),"\n",(0,r.jsxs)(t.p,{children:["See ",(0,r.jsx)(t.a,{href:"/docs/next/features/software-catalog/external-integrations/processors",children:"Custom processors"})," for a full walkthrough."]}),"\n",(0,r.jsx)(t.h2,{id:"incremental-entity-providers",children:"Incremental entity providers"}),"\n",(0,r.jsxs)(t.p,{children:["An ",(0,r.jsx)(t.em,{children:"incremental entity provider"}),' is a specialized form of entity provider for\nlarge data sources that support pagination but may not fit into memory. It\ningests data in pages across multiple "bursts", handling deletions and updates\nwithout holding the full data set at once.']}),"\n",(0,r.jsx)(t.p,{children:"Use an incremental entity provider when the data source is too large for a\nsingle fetch, or when you need fine-grained control over pagination and\nback-off behavior."}),"\n",(0,r.jsxs)(t.p,{children:["See ",(0,r.jsx)(t.a,{href:"/docs/next/features/software-catalog/external-integrations/incremental-entity-providers",children:"Incremental entity providers"})," for a\nfull walkthrough."]})]})}function h(e={}){let{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},28453(e,t,n){n.d(t,{R:()=>o,x:()=>i});var a=n(296540);let r={},s=a.createContext(r);function o(e){let t=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),a.createElement(s.Provider,{value:t},e.children)}},589583(e){e.exports=JSON.parse('{"id":"features/software-catalog/external-integrations/index","title":"External integrations","description":"How to integrate external systems with the Backstage Software Catalog","source":"@site/../docs/features/software-catalog/external-integrations/index.md","sourceDirName":"features/software-catalog/external-integrations","slug":"/features/software-catalog/external-integrations/","permalink":"/docs/next/features/software-catalog/external-integrations/","draft":false,"unlisted":false,"editUrl":"https://github.com/backstage/backstage/edit/master/docs/features/software-catalog/external-integrations/index.md","tags":[],"version":"current","frontMatter":{"id":"index","title":"External integrations","description":"How to integrate external systems with the Backstage Softw
1are Catalog"},"sidebar":"docs","previous":{"title":"Extending the model","permalink":"/docs/next/features/software-catalog/extending-the-model"},"next":{"title":"Custom entity providers","permalink":"/docs/next/features/software-catalog/external-integrations/entity-providers"}}')}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.