Authentication, keys and price
Every data call needs an account key. Create an account with your e-mail and a code: it is approved at once, with Rs 50 of free credit and your first key. Send the key in any of these headers, to the gateway or to the site:
Authorization: Bearer YOUR_KEY (to https://api.datagalactica.com/api/v1 or https://datagalactica.com/api/v1)
X-API-Key: YOUR_KEY
Ocp-Apim-Subscription-Key: YOUR_KEY
Price: each answered call (HTTP 200) costs Rs 0.16 from the account's prepaid wallet; /batch and /match cost Rs 0.16 per record found or matched. Errors and not-found answers are free, and so are /meta, /enums, /lists, the wallet endpoints and Check. Each billed response carries x-wallet-balance-inr. Top up with Rs 500, 5,000 or 50,000 from your dashboard or with /account/topup. Manage keys and download usage at /account.
AI agents can sign a person up with their e-mail (agent sign-up, auth.md); MCP clients sign in with OAuth (scope api). Unmasked contacts are turned on per account after a request.
Responses
{ "ok": true, "data": { ... }, "meta": { "api": "v1", "docs": "https://datagalactica.com/api", ... } }
{ "ok": false, "error": { "code": "not_found", "message": "..." }, "meta": { ... } }
Errors and limits
Paging
/search and /find take limit (1 to 50) and offset (0 to 500); clamped values come back in meta, and /find gives a ready next URL. Lists page with page, 100 records each, up to 50 pages.
Grades and matching
The overall grade is about contact details: verified claimed by its owner; gold we hold an e-mail and a phone, both checked (verified or deliverable); silver we hold an e-mail and a phone; bronze less. Section grades (quality.sections) say how well each part is sourced. A record from a lead list may be a different real-world entity whatever its grade: check place and identifiers, and always cite the Galactica ID and the page url.
Verify and match
Verify a company
GET/verify/company
Does this organisation exist, is it the one meant, and is it operating? Send the name as your customer typed it (legal suffixes and punctuation do not matter) with a country, city or website, or send an identifier. You get the best record, a confidence from 0 to 1, a verdict, a check per field and the other candidates.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/verify/company?name=Infosys+Ltd&country=IN&website=infosys.com"
{ "ok": true, "data": {
"verdict": "match", "confidence": 1, "operating": true,
"match": { "id": "DGC-8SFS42RSWAX9", "name": "Infosys Limited", "legal_name": "INFOSYS LIMITED", "status": "operating",
"quality": "gold", "country": "IN", "city": "Bangalore", "website": "https://www.infosys.com",
"identifiers": { "cin": "L85110KA1981PLC013115", "lei": "335800TYLGG93MM7PR89" }, "url": "https://datagalactica.com/company/DGC-8SFS42RSWAX9/infosys-limited" },
"checks": { "name": { "given": "Infosys Ltd", "found": "INFOSYS LIMITED", "ok": true, "score": 1 },
"country": { "given": "IN", "found": "IN", "ok": true }, "website": { "given": "infosys.com", "found": "https://www.infosys.com", "ok": true } },
"candidates": [ { "id": "DGC-...", "name": "Infosys BPM Limited", "confidence": 0.62 }, ... ]
} }
- verdict: match (confidence 0.8 or more), possible_match (0.55 or more), no_match. A check with ok null means the record has nothing to check against.
- A not-found answer (404) is free. A bronze match may still be a different organisation with the same name: read quality.
Verify a person in a role
GET/verify/person
Is there a public record of this person, at this employer or in this role? Checks the name against employer (current and past), title, city and country. Public professional records only; a verification never carries contact details.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/verify/person?name=Salil+Parekh&employer=Infosys"
{ "ok": true, "data": { "verdict": "match", "confidence": 0.93,
"match": { "id": "DGP-8J76H1YPDRQQ", "name": "Salil Parekh", "quality": "gold", "current": { "title": "Chief executive officer", "organization": "Infosys" }, ... },
"checks": { "name": { "ok": true, "score": 1 }, "employer": { "given": "Infosys", "found": "Infosys", "ok": true } }, "candidates": [ ... ] } }
Match CRM rows to records
POST/match
Entity resolution for a list: up to 25 rows a call, each matched to its best record with a verdict and a confidence. Organisations by name with country, city or website; people (type person) by name with employer, title, city or country. Billed per row matched or possibly matched.
curl -X POST "https://api.datagalactica.com/api/v1/match" \
-H "Authorization: Bearer YOUR_KEY" -H "content-type: application/json" \
-d '{"records": [{"name": "Infosys", "country": "IN"}, {"type": "person", "name": "Salil Parekh", "employer": "Infosys"}]}'{ "ok": true, "data": { "rows": 2, "matched": 2, "results": [
{ "row": 0, "verdict": "match", "confidence": 0.92, "match": { "id": "DGC-8SFS42RSWAX9", "name": "Infosys Limited", ... } },
{ "row": 1, "verdict": "match", "confidence": 0.93, "match": { "id": "DGP-8J76H1YPDRQQ", "name": "Salil Parekh", ... } } ] },
"meta": { "billed_units": 2 } }
Any identifier to its Galactica ID
GET/resolve
The permanent Galactica ID, name, url and grade for a CIN, LLPIN, LEI, UK company number (GB-{n}), SEC CIK (CIK-{n}), Wikidata Q-id or Galactica ID. Use it to join your data on one key.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/resolve?id=335800TYLGG93MM7PR89"
{ "ok": true, "data": { "galactica_id": "DGC-8SFS42RSWAX9", "type": "organization", "name": "Infosys Limited", "quality": "gold",
"url": "https://datagalactica.com/company/DGC-8SFS42RSWAX9/infosys-limited", "identifiers": { "cin": "L85110KA1981PLC013115", "lei": "335800TYLGG93MM7PR89", "wikidata": "Q26989" } } }
Many records in one call
POST/batch
Full records for up to 50 identifiers of any kind, people and organisations mixed. Billed per record found; ids that match nothing are free.
curl -X POST "https://api.datagalactica.com/api/v1/batch" \
-H "Authorization: Bearer YOUR_KEY" -H "content-type: application/json" \
-d '{"ids": ["DGC-8SFS42RSWAX9", "L85110KA1981PLC013115", "Q76"]}'{ "ok": true, "data": { "requested": 3, "found": 3, "results": [ { "id": "DGC-8SFS42RSWAX9", "found": true, "record": { ... } }, ... ] }, "meta": { "billed_units": 3 } }
Checks and diligence
Check a person
GET/person/check
The agent-shaped person check: is there a public record of this person with this employer, title, domain (the employer's website), city or country. Same matcher as /verify/person, returned in the decision envelope: verdict, confidence, grade, cite, conflicts (a bronze match says it may be a different person) and next.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/person/check?name=Salil+Parekh&employer=Infosys&title=CEO"
{ "ok": true, "data": { "verdict": "match", "confidence": 0.93, "grade": "gold",
"cite": { "id": "DGP-8J76H1YPDRQQ", "type": "person", "name": "Salil Parekh", "url": "..." }, "conflicts": [], "next": ["person.diligence", "person.hire_check", "person.contact"],
"checks": { "name": { "ok": true }, "employer": { "given": "Infosys", "found": "Infosys", "ok": true }, "title": { "ok": true } },
"current": { "title": "Chief executive officer", "organization_id": "DGC-8SFS42RSWAX9" } } }
- A check never carries contact details: with several candidates it would hand out every candidate's phone. Fetch contact for the one id you will use.
Same entity or not
GET/identity/check
Do two clues point to the same record? An id alone (CIN, LEI, GB-, CIK-, Q-id, Galactica ID), or type=person with name + employer, domain or city, or type=company with name + country, domain or id. Returns the decision envelope with the identifiers we store and, for organisations, operating. This is not a government KYC.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/identity/check?id=L85110KA1981PLC013115"
{ "ok": true, "data": { "verdict": "match", "confidence": 1, "grade": "gold", "cite": { "id": "DGC-8SFS42RSWAX9", ... }, "identifiers": { "cin": "...", "lei": "..." }, "operating": true } }
- aadhaar, pan, passport, ssn, account_number and similar keys answer 400 unsupported_identifier, unbilled; the value is never read or logged.
An e-mail you already have
POST/email/check
Do we hold this exact address, on which record, and what status did we store? For an address from a CRM, a signature or a website. It never opens a mailbox connection and never guesses addresses.
curl -X POST "https://api.datagalactica.com/api/v1/email/check" \
-H "Authorization: Bearer YOUR_KEY" -H "content-type: application/json" \
-d '{"email": "name@company.com"}'{ "ok": true, "data": { "verdict": "held", "status": "deliverable", "on": "person", "grade": "silver", "cite": { "id": "DGP-...", ... },
"contact": { "emails": [ ... ], "phones": [ ... ] } } }
{ "ok": true, "data": { "verdict": "not_held" } } (free)
{ "ok": true, "data": { "verdict": "withheld", "contact": null, "contact_reason": "owner_opted_out" } }
- not_held is not billed and says nothing about whether the mailbox exists.
Due-diligence summary
GET/company/{id}/diligence, /person/{id}/diligence
One call instead of five: for an organisation, the grade per section, status, legal name and form, incorporation, address, jurisdiction, identifiers, tickers, group, directors and leaders (kept apart), founders, sources and conflicts; for a person, the current role, place, sources and conflicts (family only for public figures). Both end with unknown: what was not checked.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/company/DGC-8SFS42RSWAX9/diligence"
{ "ok": true, "data": { "cite": { ... }, "grade": "gold", "status": "operating", "legal_name": "INFOSYS LIMITED", "identifiers": { ... },
"listing": { "tickers": [ ... ] }, "group": { "parent": null, "subsidiaries": [ ... ] }, "directors": [ ... ], "leaders": [ ... ],
"conflicts": [], "sources": [ ... ], "unknown": ["beneficial_owners", "sanctions", "gstin_status"] },
"meta": { "note": "Not a substitute for a law firm, an AML or sanctions screen, or a background check." } }
- Never describe a company as clean or sanctions-free from this: unknown says those were not checked.
Hiring
GET/company/{id}/hiring, /person/{id}/hire-check
Openings we hold for an organisation (count and recent titles, an honest zero when none) with its workforce role counts; and a person against a role: already there (a current role at that company), current title, skill overlap, and what they say they are looking for (empty, never guessed). Not a background check.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/person/DGP-8J76H1YPDRQQ/hire-check?role=chief+executive&company=Infosys"
{ "ok": true, "data": { "verdict": "match", "already_there": true, "current_title": "Chief executive officer", "skill_overlap": [], "looking_for": [], ... } }
Contact for one record
GET/person/{id}/contact, /company/{id}/contact
The full e-mail addresses and phone numbers we hold for one person, or an organisation's own, with the reason you need them. The same contact block also comes on /person/{id}, /company/{id}, search hits, /company/{id}/people and /batch for a signed-in account.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/person/DGP-8J76H1YPDRQQ/contact?purpose=sales"
{ "ok": true, "data": { "id": "DGP-...", "purpose": "sales", "grade": "gold",
"contact": { "emails": [ { "value": "name@company.com", "status": "deliverable" } ], "phones": [ { "value": "+91...", "status": "unverified" } ] } } }
- No purpose: 400. Owner opted out: contact null with contact_reason owner_opted_out. Over the hourly limit: 429 contact_budget.
People search with contacts
GET/people/search
The person-only alias of /search, with the person filters: city, region, country, function, seniority, skill, employer, college. For a signed-in account each hit carries the full contact, so a page holds at most 20; page with offset.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/people/search?city=pune&function=engineering&limit=20"
{ "ok": true, "data": { "type": "person", "count": 20, "results": [ { "id": "DGP-...", "name": "...", "quality": "silver", "city": "Pune", "contact": { ... } }, ... ] } }
Market and talent
Market size
GET/research/market
Counts and example organisations for a country, a city and/or an ISIC industry, with the talent map of the city. Free: it is an aggregate. null means not computed for that slice, never a guess. No person names, no contacts.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/research/market?country=IN&industry=J"
{ "ok": true, "data": { "place": { "country": "IN" }, "industry": { "code": "J", "name": "Information and communication" }, "organisations": 531252,
"top_organisations": [ { "id": "DGC-...", "name": "...", "grade": "gold" }, ... ], "people": ..., "talent": null, "as_of": "2026-10-03", "cite": "https://datagalactica.com/companies/country/in/industry/J" } }
Talent map of a city
GET/talent/{city}
Counts of the roles and skills people list in a city. Cells under 5 people are left out so a small group is never singled out. Free.
curl "https://api.datagalactica.com/api/v1/talent/pune"
{ "ok": true, "data": { "city": "Pune", "n": 1012281, "roles": [ { "name": "...", "n": 1234 } ], "skills": [ ... ], "suppressed_below": 5 } }
Watch
Follow records
POST/watch, /changes
Keep up to 500 Galactica IDs on your account's watch list (POST {"ids": [...]} up to 50 a call, {"remove": [...]} to drop), then GET /changes?since=2026-10-03 for the ones updated since. Free. Webhooks are not offered yet: poll /changes.
curl -X POST "https://api.datagalactica.com/api/v1/watch" \
-H "Authorization: Bearer YOUR_KEY" -H "content-type: application/json" \
-d '{"ids": ["DGC-8SFS42RSWAX9"]}'GET /changes?since=2026-10-03 -> { "since": "2026-10-03", "watched": 1, "changes": [ { "id": "DGC-8SFS42RSWAX9", "updated": "...", "changed": ["record"] } ] }
Free helpers
Typeahead, public card, group
GET/suggest, /{company|person}/{id}/card, /company/{id}/group
/suggest?q=info gives up to 8 names with place and grade (free). /company/{id}/card and /person/{id}/card are a free public preview: id, name, grade, one line, url. /company/{id}/group (billed) gives the parent, ultimate parent and subsidiaries.
curl "https://api.datagalactica.com/api/v1/suggest?q=infos&type=company"
{ "ok": true, "data": { "results": [ { "id": "DGC-8SFS42RSWAX9", "name": "Infosys Limited", "type": "company", "grade": "gold", "place": "Bangalore, India", "url": "..." } ] } }
Lookups
An organisation
GET/company/{id}
The full graded record of a company, non-profit, university or public body: status, founding, location, ISIC industry, size, people (founders, leaders, board), group and listing, timeline, website, registration, identifiers, sources and the grade of every section. /organization/{id} is the same.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/company/L85110KA1981PLC013115"
{ "ok": true, "data": {
"id": "DGC-8SFS42RSWAX9", "type": "organization", "kind": "company",
"name": "Infosys Limited", "status": "operating", "founded": "1981-07-02",
"location": { "city": "Bangalore", "region": "Karnataka", "country": "IN" },
"industry": { "section": "J", "section_name": "Information and communication", "label": "IT service management" },
"size": { "band": "enterprise", "employees": { "n": 328594, "as_of": "2026" } },
"people": { "founders": [ { "id": "DGP-V34W8M7CXAPX", "name": "N. R. Narayana Murthy" } ], ... },
"identifiers": { "cin": "L85110KA1981PLC013115", "lei": "335800TYLGG93MM7PR89", "wikidata": "Q26989" },
"contacts": { "emails": [ { "masked": "m***@i***.com", "status": "unverified" } ] },
"quality": { "overall": "gold", "sections": { "registration": "gold", "people": "silver", ... } },
"sources": [ { "name": "Ministry of Corporate Affairs company master data", "as_of": "2020-12-12" }, ... ],
"updated": "2026-10-03", "url": "https://datagalactica.com/company/DGC-8SFS42RSWAX9/infosys-limited"
}, "meta": { "api": "v1", ... } }
- Any source id resolves to the same record; the id in the response is always the Galactica ID.
- On an account with contact access, the record also carries an unmasked contact object (see Contacts).
A person
GET/person/{id}
A public person record: headline, current role, career, education, skills with assessment scores, achievements, public life for public figures, network, sources and grades. Private and removed profiles answer 404.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/person/DGP-929RKAMSQDNK"
{ "ok": true, "data": {
"id": "DGP-929RKAMSQDNK", "type": "person", "kind": "public_figure", "name": "Barack Obama",
"headline": "44th President of the United States (2009 to 2017)",
"public_life": { "born": { "date": "1961-08-04" }, "positions": [ { "title": "President of the United States", "from": 2009, "to": 2017 } ], ... },
"education": [ { "degree": "Juris Doctor", "institution": { "name": "Harvard Law School" }, "from": 1988, "to": 1991 } ],
"identifiers": { "wikidata": "Q76" }, "quality": { "overall": "gold" }, "url": "https://datagalactica.com/person/DGP-929RKAMSQDNK/barack-obama"
} }
Who runs an organisation
GET/company/{id}/people
Founders, leaders (with role and years), board members, and a sample of the people on Data Galactica who work there, with their Galactica IDs where they have one.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/company/DGC-8SFS42RSWAX9/people"
{ "ok": true, "data": { "organization": { "id": "DGC-8SFS42RSWAX9", "name": "Infosys Limited" },
"founders": [ { "name": "N. R. Narayana Murthy", "id": "DGP-V34W8M7CXAPX", "url": "..." } ],
"leaders": [ { "name": "Salil Parekh", "id": "DGP-8J76H1YPDRQQ", "role": "Chief executive officer", "from": 2018, "to": null } ],
"board": [], "on_datagalactica": { "count": 975, "sample": [ ... ] } } }
Dataset counts
GET/meta
How many organisations and people there are, the number of countries and the build date.
curl "https://api.datagalactica.com/api/v1/meta"
{ "ok": true, "data": { "organizations": 15521908, "persons": 30589389, "countries": 239, "built": "2026-10-03" } }
Search
Search by name and filters
GET/search
People and organisations by name or words, narrowed with filters. A well-known record whose name contains the query outranks a lead-file row that merely equals it.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/search?type=all&q=infosys&limit=5"
{ "ok": true, "data": { "type": "all", "count": 10, "results": [ {
"id": "DGC-8SFS42RSWAX9", "name": "Infosys Limited", "type": "company", "kind": "company",
"quality": "gold", "sub": "IT service management, Bangalore, India", "matched": "name",
"city": "Bangalore", "country": "India", "url": "https://datagalactica.com/company/DGC-8SFS42RSWAX9/infosys-limited"
}, ... ] }, "meta": { "limit": 5, "offset": 0 } }
- matched is name, alias or text: how the record matched.
- When names collide, prefer the higher quality. A bronze record has one unconfirmed source and may be a different real-world entity.
Ask in plain words (AI)
GET/find
A question in plain English ("engineers in bengaluru who know python", "electric vehicle battery makers in india") is read by a language model into the same filters as /search, matched, and topped up with records close in meaning. understood shows how the question was read.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/find?q=engineers+in+bengaluru+who+know+python"
{ "ok": true, "data": {
"understood": { "type": "person", "city": "Bangalore", "function": "engineering", "skill": "python" },
"count": 20, "next": "https://api.datagalactica.com/api/v1/find?q=...&limit=20&offset=20",
"results": [ { "id": "DGP-...", "name": "...", "type": "person", "quality": "silver", "city": "Bangalore", ... } ],
"related": [ ... records close in meaning ... ]
} }
- Needs an API key (a free one is enough), sent to api.datagalactica.com. Without one: 401 key_required.
- A plain name ("rachit jain") is not sent to the model; it is matched like /search.
- When the model's reading finds nothing, the words are matched as typed.
Lists
Code lists with counts
GET/enums
Every value the filters accept, with how many records carry it: ISIC industry sections, people functions, seniority, size bands, statuses, kinds, grades and countries.
curl "https://api.datagalactica.com/api/v1/enums"
{ "ok": true, "data": {
"industry": { "scheme": "ISIC Rev.4", "values": [ { "code": "L", "name": "Real estate", "organisations": 1164737 }, ... ] },
"function": [ { "code": "engineering", "people": 1319543 }, ... ],
"grade": [ { "code": "bronze", "means": "we do not yet hold both an e-mail and a phone" }, ... ],
"country": [ { "code": "IN", "name": "India", "organisations": 6432479, "people": ... }, ... ]
} }
All ranked lists
GET/lists
The 762 ranked lists behind the directory pages: organisations by industry, country, country and industry, and city; people by function, country and city.
curl "https://api.datagalactica.com/api/v1/lists?kind=company"
{ "ok": true, "data": { "count": 590, "lists": [ {
"list": "c/cc/in/sec/J", "title": "Information and communication in India", "total": 531252, "pages": 50,
"url": "https://datagalactica.com/companies/country/in/industry/J", "api": "https://datagalactica.com/api/v1/lists/c/cc/in/sec/J"
}, ... ] } }
One page of a ranked list
GET/lists/{list}
100 records of a list, records with contact details first (gold, then silver); organisations then by how well known, people in a stable mixed order. Each list exposes its first 5,000 records (50 pages); use /search with filters to reach the rest.
curl "https://api.datagalactica.com/api/v1/lists/c/cc/in/sec/J?page=2"
{ "ok": true, "data": {
"list": "c/cc/in/sec/J", "title": "Information and communication in India", "total": 531252, "page": 2, "pages": 50,
"next": "https://datagalactica.com/api/v1/lists/c/cc/in/sec/J?page=3",
"results": [ { "id": "DGC-...", "name": "...", "sub": "...", "grade": "silver", "type": "company", "url": "..." }, ... ]
} }
Owners
Galactica Check: your own records
POST/check/start, /check/verify, /check/act
A person proves an e-mail with a 6-digit code, then sees, claims, hides or asks to remove the records linked to it, or creates a new Galactica ID. Nothing reveals whether an address is held before the code is entered. The /check page runs the same steps.
curl -X POST "https://api.datagalactica.com/api/v1/check/start" \
-H "content-type: application/json" \
-d '{"email": "you@example.com"}'{ "ok": true, "data": { "sent": true } }
POST /check/verify {"email": "...", "code": "123456"} -> { "token": "...", "records": [ ... ], "actions": [ ... ] }
- Codes last 10 minutes and allow 5 tries; 5 codes an hour per address of the caller and 3 per e-mail.
- An organisation can be claimed only with an e-mail on its own website domain (not a free-mail domain).
Account and wallet
Wallet, usage and payments
GET/account, /account/usage, /account/payments
The account behind the key: balance, price per call, calls remaining and the top-up packs; the latest calls with what each was billed; the payments. All free.
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.datagalactica.com/api/v1/account"
{ "account": { "email": "you@example.com", ... }, "balance_inr": 48.72, "price_per_call_inr": 0.16, "calls_remaining": 304,
"top_up": { "endpoint": "POST https://datagalactica.com/api/v1/account/topup", "packs": [ { "amount_inr": 500, "pay_inr": 500, "calls": 3125 }, ... ] } }
Top up (a pay link)
POST/account/topup
Starts a top-up of Rs 500, 5,000 or 50,000 and returns a pay_url: the person opens it and pays by UPI, card, net banking or wallet (Razorpay). Poll status_url until status is paid. Pay links stay open 48 hours. The same is offered as UCP and ACP checkout sessions (/.well-known/ucp, /.well-known/acp.json). Free.
curl -X POST "https://api.datagalactica.com/api/v1/account/topup" \
-H "Authorization: Bearer YOUR_KEY" -H "content-type: application/json" \
-d '{"amount": 500}'{ "payment_id": "pay_3f2a...", "status": "pending", "credit_inr": 500, "amount_payable_inr": 500,
"pay_url": "https://datagalactica.com/pay/...", "status_url": "https://datagalactica.com/api/v1/account/payments/pay_3f2a...", "expires_at": "..." }
Sign-up by an AI agent
POST/agent/identity, /agent/identity/claim
An agent creates or connects a person's account with only their e-mail: we mail a 6-digit code, the agent sends it back and gets an API key (new accounts start with Rs 50 of credit). On datagalactica.com, not under /api/v1. Full protocol: /auth.md.
curl -X POST "https://datagalactica.com/agent/identity" -H "content-type: application/json" \
-d '{"login_hint": "person@example.com", "agent_name": "My Assistant"}'202 { "status": "code_sent", "claim_uri": "https://datagalactica.com/agent/identity/claim", "expires_in": 600 }
POST /agent/identity/claim {"login_hint": "...", "code": "123456"} -> 201 { "api_key": "...", "token_type": "Bearer", "new_account": true, ... }
Agents (OAuth)
Your records and contributions
GET/me, /me/contributions
For an agent acting for the owner of a Galactica ID (OAuth bearer token): the records bound to the signed-in e-mail, and the edits and notes sent with their review status.
curl -H "Authorization: Bearer ACCESS_TOKEN" "https://datagalactica.com/api/v1/me"
{ "ok": true, "data": { "records": [ { "id": "DGP-...", "name": "...", "claimed": true } ], "contributions": [ ... ] } }
Propose edits, add notes
POST/me/updates, /entities/{id}/notes
Edits to a record you claimed, and notes on any record. Everything is reviewed: contacts scrubbed, id and account numbers rejected, sensitive topics held for a person, the rest checked automatically. Approved edits show at once and survive rebuilds.
curl -X POST "https://datagalactica.com/api/v1/me/updates" \
-H "Authorization: Bearer ACCESS_TOKEN" -H "content-type: application/json" \
-d '{"id": "DGP-...", "changes": {"headline": "Data engineer"}}'{ "ok": true, "data": { "status": "applied", "review": { "decision": "approve", "risk": "low" } } }
- Scopes: profile:read, profile:write, notes:write. At most 30 contributions a day.
Anyone not signed in sees contacts masked (m***@i***.com, with a status). A signed-in account (every account confirmed its e-mail with a code) gets the full values we hold on /person/{id}, /company/{id}, search and /people/search hits, /company/{id}/people (the first 20 with an id), /batch, /email/check and the contact routes:
"contact": { "emails": [ { "value": "...", "status": "verified" } ], "phones": [ { "value": "...", "status": "unverified" } ] }
When the owner has hidden or removed a record, contact is null with contact_reason: "owner_opted_out". Up to 60 records with contacts an hour per account (then contact_reason: "hourly_limit" on records, or 429 contact_budget on contact routes and search). Every read is logged with the account, the route and the purpose, never the values. Checks, verifications, lists, /find, talent and research never carry a person's contact. There is no route that sends e-mail or SMS: give the address to the person.
OAuth for agents
GET /.well-known/oauth-authorization-server RFC 8414
GET /.well-known/oauth-protected-resource RFC 9728
POST /oauth/register RFC 7591, public clients
GET /oauth/authorize response_type=code, PKCE S256, scope=api profile:read profile:write notes:write
POST /oauth/token grant_type=authorization_code | refresh_token
The person signs in with an e-mail code and sees what the app asks for before allowing it. Scope api bills data calls to the wallet of that e-mail's account (created with the free credit if there is none); the profile and notes scopes act on the owner's own records. Access tokens last an hour; refresh tokens rotate on every use and last 30 days.
MCP
https://api.datagalactica.com/mcp an API key or OAuth; data tools billed like the API, wallet tools free
https://datagalactica.com/mcp the same server on the site
https://datagalactica.com/mcp/agent OAuth only (kept for older clients)
claude mcp add --transport http datagalactica https://api.datagalactica.com/mcp --header "Authorization: Bearer YOUR_KEY"
Tools: search, search_companies, search_people, get_company, get_person, top_companies, talent_map (Rs 0.16 each when they answer), about_dataset, get_wallet, top_up_wallet, get_payment (free), get_contact on accounts with contact access, and with OAuth the owner's whoami, get_my_profile, propose_profile_update, add_note, list_my_contributions. Discovery: server card, API catalog, auth.md, llms.txt.