# OrbitSearch API OrbitSearch is an API-key authenticated search and discovery service for agents. It exposes a SerpAPI-compatible JSON endpoint for AI agents and applications. Scrapling 0.4.11 runs internally as an allowlisted adaptive parser fallback for Bing selector drift. It is not a media source, never assigns licences, and is not configured to bypass authentication or CAPTCHAs. Base URL: https://search.rviv.in OpenAPI: https://search.rviv.in/openapi.json Create a free key: POST /api/v1/keys Content-Type: application/json Body: {"name":"My agent"} Advanced least-privilege key: POST /api/v1/keys Body: {"name":"B-roll worker","scopes":["media:read","account:read"],"expires_in_days":90,"allowed_origins":["https://studio.rviv.in"],"allowed_ips":["203.0.113.10"]} Available scopes: search:read, media:read, browser:run, account:read, keys:manage. Omitted scopes preserve full access for compatibility. Restrictions are enforced on every request. Rotate a key with POST /api/v1/keys/{id}/rotate; the old secret stops working immediately and the replacement is shown once. Store the returned apiKey securely. Send it as X-API-Key on later requests. The first key response also contains a one-time recoveryCode. Store it offline. If the API key is lost, POST it to /api/v1/keys/recover. A successful recovery returns a replacement key and a newly rotated recovery code. Search: GET /search.json?q=QUERY&engine=google GET /search.json?q=QUERY&engine=google_news GET /search.json?q=QUERY&engine=google_images GET /search.json?q=QUERY&engine=google_maps GET /search.json?q=QUERY&engine=google_videos GET /search.json?q=QUERY&engine=social GET /search.json?q=QUERY&engine=shopping GET /search.json?q=QUERY&engine=flights GET /search.json?q=QUERY&engine=hotels GET /search.json?q=QUERY&engine=reviews Discovery: GET /api/v1/autocomplete?q=QUERY GET /api/v1/trends?geo=IN GET /api/v1/extract?url=https%3A%2F%2Fexample.com Free and openly licensed media: GET /api/v1/content?q=QUERY&num=20 GET /api/v1/content?q=QUERY&types=image,video,audio,vector,code,article,event,clip&commercial=any&fresh_hours=48&num=20 GET /api/v1/everything?q=QUERY&num=3 GET /api/v1/everything?q=QUERY&num=3§ions=google_images,free_images GET /api/v1/everything?q=QUERY&num=10§ions=google_images,free_images&orient=portrait&min_width=1080&min_height=1920 POST /api/v1/batch {"queries":[{"q":"Thanjavur temple","num":3,"sections":["google_images","free_images"]}]} GET /api/v1/media?engine=free_images&q=QUERY GET /api/v1/media?engine=free_videos&q=QUERY GET /api/v1/media?engine=nasa_videos&q=QUERY GET /api/v1/media?engine=archive_videos&q=QUERY GET /api/v1/media?engine=free_images&q=QUERY&page=1&num=80&orient=portrait&size=large&color=blue&locale=en-US&min_width=1080&min_height=1920 GET /api/v1/broll?q=SCENE&type=all&orient=portrait&min_width=720&min_height=720&commercial_only=true&shot_type=close_up&setting=outdoor&use_case=detail&min_relevance=0.3&num=12 For strict safety, add no_text=true, no_watermark=true, and/or no_nsfw=true. Orbit returns only explicit false values; true and unknown are rejected. Images are fully analyzed. Videos decode and analyze early, middle, and late frames and expose sample positions plus per-frame evidence in visual_intelligence. Add analyze=top only when visual shot, setting, people, text, watermark, time-of-day or weather tags justify extra latency. The local analyzer combines CLIP, DETR, a conservative NSFW classifier, corner-aware watermark classification, and PaddleOCR text-region detection. Check search_metadata.vision_degraded; null means uncertain or not measured, never false. POST /api/v1/broll/batch {"queries":[{"q":"Chennai traffic","type":"video","orient":"landscape","min_width":720,"min_height":720,"commercial_only":true,"no_text":true,"no_watermark":true,"no_nsfw":true,"exclude_ids":[]}]} POST /api/v1/broll/plan {"source_id":"src_1","transcript_id":"txn_1","words":[{"text":"Chennai","start":0,"end":0.4},{"text":"traffic.","start":0.41,"end":1.1}],"style":{"coverage":0.18,"orientation":"portrait","commercial_only":true}} The plan response is deterministic and immutable. Send its batch_search_request directly to POST /api/v1/broll/batch, then attach chosen assets to placements by placement order. Rejected moments explain holds and coverage/spacing exclusions. POST /api/v1/broll/plans/PLAN_ID/resolve {"picks":[{"placement_id":"PLACEMENT_ID","asset":{...ONE_BROLL_RESULT}}]} GET /api/v1/broll/plans/PLAN_ID/timeline?format=otio|fcpxml|edl|broll Resolution creates a new immutable revision and never mutates the parent. It rejects unknown licences, unsafe commercial-use flags, invalid placements, and clips shorter than the requested source range. OTIO export carries search anchors, scores, B-roll tags, source attribution, and licence provenance. GET /api/v1/catalog GET /api/v1/smart-media?q=ENTITY_OR_SCENE&type=all&orient=portrait&min_width=1080&min_height=1920&analyze=top&num=10 POST /api/v1/media/feedback {"provider":"openverse","result_id":"RESULT_ID","action":"shipped","reason":"selected_by_render_gate","query":"Chennai rain"} GET /api/v1/media?engine=free_music&q=QUERY GET /api/v1/media?engine=free_bgm&q=MOOD_OR_SCENE GET /api/v1/media?engine=sound_effects&q=QUERY GET /api/v1/media?engine=trending_sfx&q=QUERY GET /api/v1/media?engine=gifs&q=QUERY GET /api/v1/media?engine=stickers&q=QUERY GET /api/v1/media?engine=icons&q=QUERY GET /api/v1/media?engine=iconify&q=QUERY GET /api/v1/media?engine=free_vectors&q=QUERY GET /api/v1/media?engine=public_domain&q=QUERY GET /api/v1/media?engine=library_of_congress&q=QUERY GET /api/v1/media?engine=nasa_images&q=QUERY GET /api/v1/media?engine=met_museum_images&q=QUERY GET /api/v1/media?engine=podcasts&q=QUERY GET /api/v1/media?engine=ebooks&q=QUERY GET /api/v1/media?engine=fonts&q=QUERY GET /api/v1/media?engine=models_3d&q=QUERY GET /api/v1/media?engine=blogs&q=QUERY GET /api/v1/media?engine=world_news&q=QUERY GET /api/v1/media?engine=research_papers&q=QUERY GET /api/v1/media?engine=hacker_news&q=QUERY GET /api/v1/media?engine=bluesky_posts&q=QUERY GET /api/v1/media?engine=instagram_posts&q=KEYWORDS_HASHTAG_OR_USER GET /api/v1/media?engine=live_events&q=QUERY GET /api/v1/media?engine=scheduled_events&q=QUERY GET /api/v1/media?engine=live_clips&q=QUERY GET /api/v1/media?engine=code_repositories&q=QUERY GET /api/v1/media?engine=tamil_memes&q=REACTION_OR_TOPIC GET /api/v1/media?engine=tamil_video_memes&q=REACTION_OR_TOPIC GET /api/v1/media?engine=cinema_memes&q=FILM_ACTOR_OR_REACTION GET /api/v1/media?engine=world_cinema_memes&q=FILM_ACTOR_LANGUAGE_OR_REACTION GET /api/v1/media?engine=world_cinema_clips&q=FILM_ACTOR_LANGUAGE_OR_SCENE GET /api/v1/media?engine=x_posts&q=KEYWORDS_HASHTAG_OR_USER Media responses use media_results. Inspect license, license_url, attribution, and commercial_use before reuse. A null commercial_use means the source did not supply enough license information to make that determination. Cinema meme results normally have rights_status=verify_at_source, commercial_use=null, and download_allowed=false because film frames, dialogue, music, and user edits may be copyrighted. Use source_url or embed_url. Image meme results expose the indexed original as download_url and list all technical choices in fetch_options. This does not grant reuse rights. Video meme results expose source, embed, and thumbnail choices but no ripping URL. Search everything returns a sections object keyed by engine. Pass a comma- separated sections allowlist to execute only those engines; omit it to fan out across all 103. Each section has status, count, and results or error. Results are cached for five minutes. num is capped at 20. Image/video sections accept orient=portrait|landscape|square plus min_width and min_height. Results without dimensions are excluded when dimensional filters are active. google_images includes license=unknown, commercial_use=unknown, sourceUrl, and rights_status=verify_at_source. POST /api/v1/batch accepts 1-20 queries, each with its own sections and filter fields, and returns ordered result sets. Each section has a 15-second response budget; slow providers return a partial result. Free image and video results come from independent open-media sources including Openverse, Wikimedia Commons, and Internet Archive. Library of Congress photos use its official keyless JSON API and preserve the catalog rights advisory. NASA imagery uses the official NASA Image and Video Library; its commercial_use field remains unknown because NASA's media rules include logo, endorsement, identifiable-person, and third-party-content caveats. Free music and BGM combine Openverse with downloadable Creative Commons audio from Internet Archive netlabels/open audio. commercial=true on /api/v1/content removes non-commercial and unknown-rights tracks before ranking. X posts use the official recent-search API when X_BEARER_TOKEN is configured. Without that credential, Orbit returns only third-party public-index titles, snippets, and links to X; it does not crawl or scrape X pages. X content is not marked downloadable or commercially reusable. Respect the source post and X terms. Without it, results are labeled provider=indexed_web and contain indexed public post links or an X search destination. X API usage can incur provider charges. Optional browser research (requires the server operator to configure BROWSER_USE_API_KEY): POST /api/v1/browser/tasks {"task":"Extract the current product names and prices","allowed_domains":["example.com"],"start_url":"https://example.com/products","model":"bu-mini","max_cost_usd":0.25,"output_schema":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"price":{"type":"string"}}}}} Poll GET /api/v1/browser/tasks/{id} until status is stopped, timed_out, or error. This integration is intentionally read-only: no logins, account creation, messages, posts, purchases, legal acceptance, or external-data changes. Useful parameters: location, gl, hl, google_domain, num, start, ll. Use safe=active (default) or safe=off. Use tbs=qdr:d, qdr:w, qdr:m, or qdr:y to request results from the last day, week, month, or year. Web results are in organic_results. Image results are in images_results. Video results are in video_results, social posts in social_results, shopping in shopping_results, flights in flight_results, hotels in hotel_results, and reviews in review_results. Shopping and travel are discovery results rather than live inventory; inspect data_quality and price_verified before using a price. To download an image, fetch its download_url directly; it is a short-lived signed binary-download URL and does not require the API-key header. Quota: GET /account.json GET /usage Only successful search responses consume quota. Validation errors, upstream failures, image downloads, and account requests do not consume quota. Every search response includes search_metadata.id and search_metadata.json_endpoint. The authenticated customer can retrieve that result from /searches/{search_id}.json for up to 31 days. For long-running agent workflows, add async=true. The initial response has search_metadata.status="Processing". Poll search_metadata.json_endpoint until the status becomes "Success" or "Error". Only successful completion is billed.